From b13b2700abbdfecd9e79eeb9730c566b62f39b71 Mon Sep 17 00:00:00 2001 From: kotzilla Date: Mon, 1 Sep 2014 07:51:45 +0000 Subject: [PATCH] Commit with photologue and profile and registration --- accounts/edit_forms.py | 2 +- accounts/forms.py | 79 +- city/models.py | 4 + city/views.py | 4 +- company/edit_forms.py | 7 +- company/forms.py | 8 +- country/models.py | 4 + exposition/views.py | 27 +- functions/form_check.py | 16 +- jpeg-8c/.deps/cdjpeg.Po | 116 + jpeg-8c/.deps/cjpeg.Po | 116 + jpeg-8c/.deps/djpeg.Po | 118 + jpeg-8c/.deps/jaricom.Plo | 112 + jpeg-8c/.deps/jcapimin.Plo | 112 + jpeg-8c/.deps/jcapistd.Plo | 112 + jpeg-8c/.deps/jcarith.Plo | 112 + jpeg-8c/.deps/jccoefct.Plo | 112 + jpeg-8c/.deps/jccolor.Plo | 112 + jpeg-8c/.deps/jcdctmgr.Plo | 114 + jpeg-8c/.deps/jchuff.Plo | 112 + jpeg-8c/.deps/jcinit.Plo | 112 + jpeg-8c/.deps/jcmainct.Plo | 112 + jpeg-8c/.deps/jcmarker.Plo | 112 + jpeg-8c/.deps/jcmaster.Plo | 112 + jpeg-8c/.deps/jcomapi.Plo | 112 + jpeg-8c/.deps/jcparam.Plo | 112 + jpeg-8c/.deps/jcprepct.Plo | 112 + jpeg-8c/.deps/jcsample.Plo | 112 + jpeg-8c/.deps/jctrans.Plo | 112 + jpeg-8c/.deps/jdapimin.Plo | 112 + jpeg-8c/.deps/jdapistd.Plo | 112 + jpeg-8c/.deps/jdarith.Plo | 112 + jpeg-8c/.deps/jdatadst.Plo | 110 + jpeg-8c/.deps/jdatasrc.Plo | 110 + jpeg-8c/.deps/jdcoefct.Plo | 112 + jpeg-8c/.deps/jdcolor.Plo | 112 + jpeg-8c/.deps/jddctmgr.Plo | 114 + jpeg-8c/.deps/jdhuff.Plo | 112 + jpeg-8c/.deps/jdinput.Plo | 112 + jpeg-8c/.deps/jdmainct.Plo | 112 + jpeg-8c/.deps/jdmarker.Plo | 112 + jpeg-8c/.deps/jdmaster.Plo | 112 + jpeg-8c/.deps/jdmerge.Plo | 112 + jpeg-8c/.deps/jdpostct.Plo | 112 + jpeg-8c/.deps/jdsample.Plo | 112 + jpeg-8c/.deps/jdtrans.Plo | 112 + jpeg-8c/.deps/jerror.Plo | 112 + jpeg-8c/.deps/jfdctflt.Plo | 114 + jpeg-8c/.deps/jfdctfst.Plo | 114 + jpeg-8c/.deps/jfdctint.Plo | 114 + jpeg-8c/.deps/jidctflt.Plo | 114 + jpeg-8c/.deps/jidctfst.Plo | 114 + jpeg-8c/.deps/jidctint.Plo | 114 + jpeg-8c/.deps/jmemmgr.Plo | 114 + jpeg-8c/.deps/jmemnobs.Plo | 114 + jpeg-8c/.deps/jpegtran.Po | 118 + jpeg-8c/.deps/jquant1.Plo | 112 + jpeg-8c/.deps/jquant2.Plo | 112 + jpeg-8c/.deps/jutils.Plo | 112 + jpeg-8c/.deps/rdbmp.Po | 114 + jpeg-8c/.deps/rdcolmap.Po | 114 + jpeg-8c/.deps/rdgif.Po | 114 + jpeg-8c/.deps/rdjpgcom.Po | 110 + jpeg-8c/.deps/rdppm.Po | 114 + jpeg-8c/.deps/rdrle.Po | 114 + jpeg-8c/.deps/rdswitch.Po | 116 + jpeg-8c/.deps/rdtarga.Po | 114 + jpeg-8c/.deps/transupp.Po | 116 + jpeg-8c/.deps/wrbmp.Po | 114 + jpeg-8c/.deps/wrgif.Po | 114 + jpeg-8c/.deps/wrjpgcom.Po | 105 + jpeg-8c/.deps/wrppm.Po | 114 + jpeg-8c/.deps/wrrle.Po | 114 + jpeg-8c/.deps/wrtarga.Po | 114 + jpeg-8c/.libs/cjpeg | Bin 0 -> 136198 bytes jpeg-8c/.libs/djpeg | Bin 0 -> 130827 bytes jpeg-8c/.libs/jpegtran | Bin 0 -> 124942 bytes jpeg-8c/.libs/libjpeg.la | 1 + jpeg-8c/.libs/libjpeg.lai | 41 + jpeg-8c/.libs/libjpeg.so | 1 + jpeg-8c/.libs/libjpeg.so.8 | 1 + jpeg-8c/.libs/libjpeg.so.8.3.0 | Bin 0 -> 1346805 bytes jpeg-8c/Makefile | 1092 ++ jpeg-8c/Makefile.am | 134 + jpeg-8c/Makefile.in | 1092 ++ jpeg-8c/README | 326 + jpeg-8c/aclocal.m4 | 9471 +++++++++ jpeg-8c/ansi2knr.1 | 36 + jpeg-8c/ansi2knr.c | 739 + jpeg-8c/cderror.h | 134 + jpeg-8c/cdjpeg.c | 181 + jpeg-8c/cdjpeg.h | 187 + jpeg-8c/change.log | 326 + jpeg-8c/cjpeg | 225 + jpeg-8c/cjpeg.1 | 339 + jpeg-8c/cjpeg.c | 639 + jpeg-8c/ckconfig.c | 402 + jpeg-8c/coderules.txt | 118 + jpeg-8c/config.guess | 1501 ++ jpeg-8c/config.log | 1086 ++ jpeg-8c/config.status | 2084 ++ jpeg-8c/config.sub | 1705 ++ jpeg-8c/configure | 15870 ++++++++++++++++ jpeg-8c/configure.ac | 318 + jpeg-8c/depcomp | 630 + jpeg-8c/djpeg | 225 + jpeg-8c/djpeg.1 | 252 + jpeg-8c/djpeg.c | 617 + jpeg-8c/example.c | 433 + jpeg-8c/filelist.txt | 215 + jpeg-8c/install-sh | 520 + jpeg-8c/install.txt | 1096 ++ jpeg-8c/jaricom.c | 153 + jpeg-8c/jaricom.lo | 12 + jpeg-8c/jcapimin.c | 288 + jpeg-8c/jcapimin.lo | 12 + jpeg-8c/jcapistd.c | 161 + jpeg-8c/jcapistd.lo | 12 + jpeg-8c/jcarith.c | 934 + jpeg-8c/jcarith.lo | 12 + jpeg-8c/jccoefct.c | 453 + jpeg-8c/jccoefct.lo | 12 + jpeg-8c/jccolor.c | 459 + jpeg-8c/jccolor.lo | 12 + jpeg-8c/jcdctmgr.c | 482 + jpeg-8c/jcdctmgr.lo | 12 + jpeg-8c/jchuff.c | 1576 ++ jpeg-8c/jchuff.lo | 12 + jpeg-8c/jcinit.c | 65 + jpeg-8c/jcinit.lo | 12 + jpeg-8c/jcmainct.c | 293 + jpeg-8c/jcmainct.lo | 12 + jpeg-8c/jcmarker.c | 682 + jpeg-8c/jcmarker.lo | 12 + jpeg-8c/jcmaster.c | 858 + jpeg-8c/jcmaster.lo | 12 + jpeg-8c/jcomapi.c | 106 + jpeg-8c/jcomapi.lo | 12 + jpeg-8c/jconfig.bcc | 48 + jpeg-8c/jconfig.cfg | 53 + jpeg-8c/jconfig.dj | 38 + jpeg-8c/jconfig.h | 54 + jpeg-8c/jconfig.mac | 43 + jpeg-8c/jconfig.manx | 43 + jpeg-8c/jconfig.mc6 | 52 + jpeg-8c/jconfig.sas | 43 + jpeg-8c/jconfig.st | 42 + jpeg-8c/jconfig.txt | 164 + jpeg-8c/jconfig.vc | 45 + jpeg-8c/jconfig.vms | 37 + jpeg-8c/jconfig.wat | 38 + jpeg-8c/jcparam.c | 632 + jpeg-8c/jcparam.lo | 12 + jpeg-8c/jcprepct.c | 358 + jpeg-8c/jcprepct.lo | 12 + jpeg-8c/jcsample.c | 545 + jpeg-8c/jcsample.lo | 12 + jpeg-8c/jctrans.c | 382 + jpeg-8c/jctrans.lo | 12 + jpeg-8c/jdapimin.c | 396 + jpeg-8c/jdapimin.lo | 12 + jpeg-8c/jdapistd.c | 275 + jpeg-8c/jdapistd.lo | 12 + jpeg-8c/jdarith.c | 772 + jpeg-8c/jdarith.lo | 12 + jpeg-8c/jdatadst.c | 267 + jpeg-8c/jdatadst.lo | 12 + jpeg-8c/jdatasrc.c | 274 + jpeg-8c/jdatasrc.lo | 12 + jpeg-8c/jdcoefct.c | 736 + jpeg-8c/jdcoefct.lo | 12 + jpeg-8c/jdcolor.c | 396 + jpeg-8c/jdcolor.lo | 12 + jpeg-8c/jdct.h | 393 + jpeg-8c/jddctmgr.c | 384 + jpeg-8c/jddctmgr.lo | 12 + jpeg-8c/jdhuff.c | 1541 ++ jpeg-8c/jdhuff.lo | 12 + jpeg-8c/jdinput.c | 661 + jpeg-8c/jdinput.lo | 12 + jpeg-8c/jdmainct.c | 512 + jpeg-8c/jdmainct.lo | 12 + jpeg-8c/jdmarker.c | 1406 ++ jpeg-8c/jdmarker.lo | 12 + jpeg-8c/jdmaster.c | 533 + jpeg-8c/jdmaster.lo | 12 + jpeg-8c/jdmerge.c | 400 + jpeg-8c/jdmerge.lo | 12 + jpeg-8c/jdpostct.c | 290 + jpeg-8c/jdpostct.lo | 12 + jpeg-8c/jdsample.c | 361 + jpeg-8c/jdsample.lo | 12 + jpeg-8c/jdtrans.c | 140 + jpeg-8c/jdtrans.lo | 12 + jpeg-8c/jerror.c | 252 + jpeg-8c/jerror.h | 304 + jpeg-8c/jerror.lo | 12 + jpeg-8c/jfdctflt.c | 174 + jpeg-8c/jfdctflt.lo | 12 + jpeg-8c/jfdctfst.c | 230 + jpeg-8c/jfdctfst.lo | 12 + jpeg-8c/jfdctint.c | 4348 +++++ jpeg-8c/jfdctint.lo | 12 + jpeg-8c/jidctflt.c | 235 + jpeg-8c/jidctflt.lo | 12 + jpeg-8c/jidctfst.c | 368 + jpeg-8c/jidctfst.lo | 12 + jpeg-8c/jidctint.c | 5137 +++++ jpeg-8c/jidctint.lo | 12 + jpeg-8c/jinclude.h | 91 + jpeg-8c/jmemansi.c | 167 + jpeg-8c/jmemdos.c | 638 + jpeg-8c/jmemdosa.asm | 379 + jpeg-8c/jmemmac.c | 289 + jpeg-8c/jmemmgr.c | 1118 ++ jpeg-8c/jmemmgr.lo | 12 + jpeg-8c/jmemname.c | 276 + jpeg-8c/jmemnobs.c | 109 + jpeg-8c/jmemnobs.lo | 12 + jpeg-8c/jmemsys.h | 198 + jpeg-8c/jmorecfg.h | 371 + jpeg-8c/jpegint.h | 407 + jpeg-8c/jpeglib.h | 1160 ++ jpeg-8c/jpegtran | 225 + jpeg-8c/jpegtran.1 | 285 + jpeg-8c/jpegtran.c | 560 + jpeg-8c/jquant1.c | 856 + jpeg-8c/jquant1.lo | 12 + jpeg-8c/jquant2.c | 1310 ++ jpeg-8c/jquant2.lo | 12 + jpeg-8c/jutils.c | 231 + jpeg-8c/jutils.lo | 12 + jpeg-8c/jversion.h | 14 + jpeg-8c/libjpeg.la | 41 + jpeg-8c/libjpeg.map | 4 + jpeg-8c/libjpeg.txt | 3084 +++ jpeg-8c/libtool | 10062 ++++++++++ jpeg-8c/ltmain.sh | 9636 ++++++++++ jpeg-8c/makcjpeg.st | 36 + jpeg-8c/makdjpeg.st | 36 + jpeg-8c/makeadsw.vc6 | 77 + jpeg-8c/makeasln.v10 | 33 + jpeg-8c/makecdep.vc6 | 82 + jpeg-8c/makecdsp.vc6 | 130 + jpeg-8c/makecfil.v10 | 69 + jpeg-8c/makecmak.vc6 | 159 + jpeg-8c/makecvcx.v10 | 76 + jpeg-8c/makeddep.vc6 | 82 + jpeg-8c/makeddsp.vc6 | 130 + jpeg-8c/makedfil.v10 | 69 + jpeg-8c/makedmak.vc6 | 159 + jpeg-8c/makedvcx.v10 | 76 + jpeg-8c/makefile.ansi | 221 + jpeg-8c/makefile.bcc | 292 + jpeg-8c/makefile.dj | 227 + jpeg-8c/makefile.manx | 221 + jpeg-8c/makefile.mc6 | 256 + jpeg-8c/makefile.mms | 225 + jpeg-8c/makefile.sas | 259 + jpeg-8c/makefile.unix | 235 + jpeg-8c/makefile.vc | 273 + jpeg-8c/makefile.vms | 142 + jpeg-8c/makefile.wat | 240 + jpeg-8c/makejdep.vc6 | 423 + jpeg-8c/makejdsp.vc6 | 285 + jpeg-8c/makejdsw.vc6 | 29 + jpeg-8c/makejfil.v10 | 186 + jpeg-8c/makejmak.vc6 | 425 + jpeg-8c/makejsln.v10 | 17 + jpeg-8c/makejvcx.v10 | 112 + jpeg-8c/makeproj.mac | 213 + jpeg-8c/makerdep.vc6 | 6 + jpeg-8c/makerdsp.vc6 | 78 + jpeg-8c/makerfil.v10 | 30 + jpeg-8c/makermak.vc6 | 110 + jpeg-8c/makervcx.v10 | 62 + jpeg-8c/maketdep.vc6 | 43 + jpeg-8c/maketdsp.vc6 | 122 + jpeg-8c/maketfil.v10 | 63 + jpeg-8c/maketmak.vc6 | 131 + jpeg-8c/maketvcx.v10 | 74 + jpeg-8c/makewdep.vc6 | 6 + jpeg-8c/makewdsp.vc6 | 78 + jpeg-8c/makewfil.v10 | 30 + jpeg-8c/makewmak.vc6 | 110 + jpeg-8c/makewvcx.v10 | 62 + jpeg-8c/makljpeg.st | 68 + jpeg-8c/maktjpeg.st | 30 + jpeg-8c/makvms.opt | 4 + jpeg-8c/missing | 376 + jpeg-8c/rdbmp.c | 480 + jpeg-8c/rdcolmap.c | 253 + jpeg-8c/rdgif.c | 38 + jpeg-8c/rdjpgcom | Bin 0 -> 24887 bytes jpeg-8c/rdjpgcom.1 | 63 + jpeg-8c/rdjpgcom.c | 515 + jpeg-8c/rdppm.c | 459 + jpeg-8c/rdrle.c | 387 + jpeg-8c/rdswitch.c | 365 + jpeg-8c/rdtarga.c | 500 + jpeg-8c/stamp-h1 | 1 + jpeg-8c/structure.txt | 945 + jpeg-8c/testimg.bmp | Bin 0 -> 35050 bytes jpeg-8c/testimg.jpg | Bin 0 -> 5764 bytes jpeg-8c/testimg.ppm | 4 + jpeg-8c/testimgp.jpg | Bin 0 -> 5645 bytes jpeg-8c/testorig.jpg | Bin 0 -> 5770 bytes jpeg-8c/testprog.jpg | Bin 0 -> 5655 bytes jpeg-8c/transupp.c | 1583 ++ jpeg-8c/transupp.h | 210 + jpeg-8c/usage.txt | 631 + jpeg-8c/wizard.txt | 211 + jpeg-8c/wrbmp.c | 442 + jpeg-8c/wrgif.c | 399 + jpeg-8c/wrjpgcom | Bin 0 -> 26870 bytes jpeg-8c/wrjpgcom.1 | 103 + jpeg-8c/wrjpgcom.c | 583 + jpeg-8c/wrppm.c | 269 + jpeg-8c/wrrle.c | 305 + jpeg-8c/wrtarga.c | 253 + jpegsrc.v8c.tar.gz | Bin 0 -> 986681 bytes password_reset/__init__.py | 1 + password_reset/forms.py | 119 + .../locale/de/LC_MESSAGES/django.mo | Bin 0 -> 3002 bytes .../locale/de/LC_MESSAGES/django.po | 127 + .../locale/es/LC_MESSAGES/django.mo | Bin 0 -> 2779 bytes .../locale/es/LC_MESSAGES/django.po | 131 + .../locale/ka/LC_MESSAGES/django.mo | Bin 0 -> 4179 bytes .../locale/ka/LC_MESSAGES/django.po | 133 + .../locale/nb/LC_MESSAGES/django.mo | Bin 0 -> 2463 bytes .../locale/nb/LC_MESSAGES/django.po | 137 + .../locale/pl/LC_MESSAGES/django.mo | Bin 0 -> 2904 bytes .../locale/pl/LC_MESSAGES/django.po | 117 + .../locale/ru/LC_MESSAGES/django.mo | Bin 0 -> 3449 bytes .../locale/ru/LC_MESSAGES/django.po | 125 + .../locale/zh/LC_MESSAGES/django.mo | Bin 0 -> 2524 bytes .../locale/zh/LC_MESSAGES/django.po | 122 + password_reset/signals.py | 6 + .../templates/password_reset/base.html | 1 + .../password_reset/recovery_done.html | 7 + .../password_reset/recovery_email.txt | 9 + .../password_reset/recovery_email_subject.txt | 1 + .../password_reset/recovery_form.html | 13 + .../templates/password_reset/reset.html | 14 + .../templates/password_reset/reset_sent.html | 8 + password_reset/tests/__init__.py | 0 password_reset/tests/models.py | 0 password_reset/tests/settings.py | 17 + password_reset/tests/templates/404.html | 0 password_reset/tests/templates/base.html | 3 + password_reset/tests/tests.py | 364 + password_reset/tests/urls.py | 13 + password_reset/tests/views.py | 16 + password_reset/urls.py | 14 + password_reset/utils.py | 10 + password_reset/views.py | 164 + photologue/__init__.py | 5 + photologue/admin.py | 254 + .../templates/photologue/gallery_archive.html | 27 + .../photologue/gallery_archive_day.html | 27 + .../photologue/gallery_archive_month.html | 27 + .../photologue/gallery_archive_year.html | 17 + .../templates/photologue/gallery_detail.html | 20 + .../templates/photologue/gallery_list.html | 34 + .../templates/photologue/photo_archive.html | 21 + .../photologue/photo_archive_day.html | 21 + .../photologue/photo_archive_month.html | 21 + .../photologue/photo_archive_year.html | 14 + .../templates/photologue/photo_detail.html | 23 + .../templates/photologue/photo_list.html | 27 + .../templates/photologue/root.html | 1 + .../photologue/tags/next_in_gallery.html | 3 + .../photologue/tags/prev_in_gallery.html | 3 + photologue/locale/cs/LC_MESSAGES/django.mo | Bin 0 -> 9634 bytes photologue/locale/cs/LC_MESSAGES/django.po | 639 + photologue/locale/da/LC_MESSAGES/django.mo | Bin 0 -> 8401 bytes photologue/locale/da/LC_MESSAGES/django.po | 633 + photologue/locale/de/LC_MESSAGES/django.mo | Bin 0 -> 9161 bytes photologue/locale/de/LC_MESSAGES/django.po | 646 + photologue/locale/en/LC_MESSAGES/django.mo | Bin 0 -> 416 bytes photologue/locale/en/LC_MESSAGES/django.po | 596 + photologue/locale/en_US/LC_MESSAGES/django.mo | Bin 0 -> 9169 bytes photologue/locale/en_US/LC_MESSAGES/django.po | 632 + photologue/locale/es_ES/LC_MESSAGES/django.mo | Bin 0 -> 13580 bytes photologue/locale/es_ES/LC_MESSAGES/django.po | 599 + photologue/locale/eu/LC_MESSAGES/django.mo | Bin 0 -> 490 bytes photologue/locale/eu/LC_MESSAGES/django.po | 597 + photologue/locale/fr/LC_MESSAGES/django.mo | Bin 0 -> 8183 bytes photologue/locale/fr/LC_MESSAGES/django.po | 637 + photologue/locale/hu/LC_MESSAGES/django.mo | Bin 0 -> 9075 bytes photologue/locale/hu/LC_MESSAGES/django.po | 640 + photologue/locale/it/LC_MESSAGES/django.mo | Bin 0 -> 8748 bytes photologue/locale/it/LC_MESSAGES/django.po | 638 + photologue/locale/nl/LC_MESSAGES/django.mo | Bin 0 -> 8594 bytes photologue/locale/nl/LC_MESSAGES/django.po | 636 + photologue/locale/no/LC_MESSAGES/django.mo | Bin 0 -> 7494 bytes photologue/locale/no/LC_MESSAGES/django.po | 621 + photologue/locale/pl/LC_MESSAGES/django.mo | Bin 0 -> 7786 bytes photologue/locale/pl/LC_MESSAGES/django.po | 636 + photologue/locale/pt/LC_MESSAGES/django.mo | Bin 0 -> 8625 bytes photologue/locale/pt/LC_MESSAGES/django.po | 637 + photologue/locale/pt_BR/LC_MESSAGES/django.mo | Bin 0 -> 8639 bytes photologue/locale/pt_BR/LC_MESSAGES/django.po | 637 + photologue/locale/ru/LC_MESSAGES/django.mo | Bin 0 -> 11474 bytes photologue/locale/ru/LC_MESSAGES/django.po | 646 + photologue/locale/sk/LC_MESSAGES/django.mo | Bin 0 -> 13407 bytes photologue/locale/sk/LC_MESSAGES/django.po | 643 + photologue/locale/tr/LC_MESSAGES/django.mo | Bin 0 -> 7435 bytes photologue/locale/tr/LC_MESSAGES/django.po | 613 + photologue/management/__init__.py | 0 photologue/management/commands/__init__.py | 40 + photologue/management/commands/plcache.py | 46 + .../management/commands/plcreatesize.py | 15 + photologue/management/commands/plflush.py | 37 + photologue/managers.py | 23 + photologue/migrations/0001_initial.py | 157 + photologue/migrations/0002_photosize_data.py | 43 + .../migrations/0003_auto_20140822_1716.py | 19 + photologue/migrations/__init__.py | 18 + photologue/models.py | 1020 + photologue/res/sample.jpg | Bin 0 -> 14453 bytes photologue/res/test_photologue_"ing.jpg | Bin 0 -> 659 bytes photologue/res/test_photologue_landscape.jpg | Bin 0 -> 659 bytes photologue/res/test_photologue_portrait.jpg | Bin 0 -> 659 bytes photologue/res/test_photologue_square.jpg | Bin 0 -> 573 bytes photologue/res/zips/ignored_files.zip | Bin 0 -> 15784 bytes photologue/res/zips/not_image.zip | Bin 0 -> 7815 bytes photologue/res/zips/sample.zip | Bin 0 -> 7652 bytes photologue/sitemaps.py | 56 + photologue/south_migrations/0001_initial.py | 207 + ...chg_field_galleryupload_title__chg_fiel.py | 145 + .../0003_auto__chg_field_photosize_name.py | 98 + .../0004_initial_photosizes.py | 120 + photologue/south_migrations/0005_auto_28.py | 138 + photologue/south_migrations/0006_data_28.py | 134 + ...007_auto__chg_field_galleryupload_title.py | 106 + photologue/south_migrations/__init__.py | 0 .../templates/photologue/gallery_archive.html | 35 + .../photologue/gallery_archive_day.html | 22 + .../photologue/gallery_archive_month.html | 39 + .../photologue/gallery_archive_year.html | 39 + .../templates/photologue/gallery_detail.html | 24 + .../templates/photologue/gallery_list.html | 35 + .../photologue/includes/gallery_sample.html | 17 + .../photologue/includes/paginator.html | 20 + .../templates/photologue/photo_archive.html | 43 + .../photologue/photo_archive_day.html | 26 + .../photologue/photo_archive_month.html | 43 + .../photologue/photo_archive_year.html | 48 + .../templates/photologue/photo_detail.html | 35 + .../templates/photologue/photo_list.html | 28 + photologue/templates/photologue/root.html | 1 + .../photologue/tags/next_in_gallery.html | 5 + .../photologue/tags/prev_in_gallery.html | 5 + photologue/templatetags/__init__.py | 0 photologue/templatetags/photologue_tags.py | 129 + photologue/tests/__init__.py | 9 + photologue/tests/factories.py | 109 + photologue/tests/helpers.py | 16 + photologue/tests/templates/base.html | 0 photologue/tests/test_effect.py | 12 + photologue/tests/test_gallery.py | 63 + photologue/tests/test_photo.py | 194 + photologue/tests/test_photosize.py | 30 + photologue/tests/test_resize.py | 132 + photologue/tests/test_sitemap.py | 29 + photologue/tests/test_sites.py | 115 + photologue/tests/test_urls.py | 15 + photologue/tests/test_views_gallery.py | 90 + photologue/tests/test_views_photo.py | 95 + photologue/tests/test_zipupload.py | 127 + photologue/urls.py | 82 + photologue/utils/EXIF.py | 1768 ++ photologue/utils/__init__.py | 0 photologue/utils/reflection.py | 92 + photologue/utils/watermark.py | 64 + photologue/views.py | 111 + proj/production.py | 4 +- proj/settings.py | 1 + proj/urls.py | 4 +- proj/views.py | 8 +- registration/backends/default/views.py | 35 + static/client/css/main.css | 9 +- static/client/css/pages/exposition_by.css | 24 + static/client/css/regions.css | 2 +- static/client/img/sprites.png | Bin 70060 -> 56102 bytes static/client/js/main.js | 62 +- .../client/js/pages/complete_registration.js | 47 + static/client/js/pages/profile.js | 5 +- static/client/js/pages/profile_company.js | 3 + static/css/pages/exposition_by.css | 24 + static/ninjaplugin/plugin/index.html | 24 + static/ninjaplugin/plugin/init.js | 16 + .../ninjaplugin/plugin/jquery.mousewheel.js | 213 + static/ninjaplugin/plugin/plugin.css | 69 + static/ninjaplugin/plugin/plugin.js | 147 + templates/client/accounts/fill_company.html | 36 +- templates/client/accounts/new_profile.html | 46 +- templates/client/blank.html | 36 +- .../client/exposition/exposition_by.html | 42 + .../client/exposition/exposition_by_city.html | 8 +- .../exposition/exposition_by_country.html | 8 +- .../exposition/exposition_by_theme.html | 7 +- templates/client/password_reset/base.html | 34 + .../client/password_reset/recovery_done.html | 24 + templates/client/password_reset/reset.html | 46 + .../client/password_reset/reset_sent.html | 19 + templates/client/popups/create_company.html | 7 +- templates/client/popups/login.html | 2 +- templates/client/popups/pswd_recovery.html | 22 + templates/client/popups/reg_send.html | 8 + templates/client/popups/user_information.html | 51 + templates/client/test_plugin.html | 25 + .../registration/activation_complete.html | 21 +- 514 files changed, 148277 insertions(+), 51 deletions(-) create mode 100644 jpeg-8c/.deps/cdjpeg.Po create mode 100644 jpeg-8c/.deps/cjpeg.Po create mode 100644 jpeg-8c/.deps/djpeg.Po create mode 100644 jpeg-8c/.deps/jaricom.Plo create mode 100644 jpeg-8c/.deps/jcapimin.Plo create mode 100644 jpeg-8c/.deps/jcapistd.Plo create mode 100644 jpeg-8c/.deps/jcarith.Plo create mode 100644 jpeg-8c/.deps/jccoefct.Plo create mode 100644 jpeg-8c/.deps/jccolor.Plo create mode 100644 jpeg-8c/.deps/jcdctmgr.Plo create mode 100644 jpeg-8c/.deps/jchuff.Plo create mode 100644 jpeg-8c/.deps/jcinit.Plo create mode 100644 jpeg-8c/.deps/jcmainct.Plo create mode 100644 jpeg-8c/.deps/jcmarker.Plo create mode 100644 jpeg-8c/.deps/jcmaster.Plo create mode 100644 jpeg-8c/.deps/jcomapi.Plo create mode 100644 jpeg-8c/.deps/jcparam.Plo create mode 100644 jpeg-8c/.deps/jcprepct.Plo create mode 100644 jpeg-8c/.deps/jcsample.Plo create mode 100644 jpeg-8c/.deps/jctrans.Plo create mode 100644 jpeg-8c/.deps/jdapimin.Plo create mode 100644 jpeg-8c/.deps/jdapistd.Plo create mode 100644 jpeg-8c/.deps/jdarith.Plo create mode 100644 jpeg-8c/.deps/jdatadst.Plo create mode 100644 jpeg-8c/.deps/jdatasrc.Plo create mode 100644 jpeg-8c/.deps/jdcoefct.Plo create mode 100644 jpeg-8c/.deps/jdcolor.Plo create mode 100644 jpeg-8c/.deps/jddctmgr.Plo create mode 100644 jpeg-8c/.deps/jdhuff.Plo create mode 100644 jpeg-8c/.deps/jdinput.Plo create mode 100644 jpeg-8c/.deps/jdmainct.Plo create mode 100644 jpeg-8c/.deps/jdmarker.Plo create mode 100644 jpeg-8c/.deps/jdmaster.Plo create mode 100644 jpeg-8c/.deps/jdmerge.Plo create mode 100644 jpeg-8c/.deps/jdpostct.Plo create mode 100644 jpeg-8c/.deps/jdsample.Plo create mode 100644 jpeg-8c/.deps/jdtrans.Plo create mode 100644 jpeg-8c/.deps/jerror.Plo create mode 100644 jpeg-8c/.deps/jfdctflt.Plo create mode 100644 jpeg-8c/.deps/jfdctfst.Plo create mode 100644 jpeg-8c/.deps/jfdctint.Plo create mode 100644 jpeg-8c/.deps/jidctflt.Plo create mode 100644 jpeg-8c/.deps/jidctfst.Plo create mode 100644 jpeg-8c/.deps/jidctint.Plo create mode 100644 jpeg-8c/.deps/jmemmgr.Plo create mode 100644 jpeg-8c/.deps/jmemnobs.Plo create mode 100644 jpeg-8c/.deps/jpegtran.Po create mode 100644 jpeg-8c/.deps/jquant1.Plo create mode 100644 jpeg-8c/.deps/jquant2.Plo create mode 100644 jpeg-8c/.deps/jutils.Plo create mode 100644 jpeg-8c/.deps/rdbmp.Po create mode 100644 jpeg-8c/.deps/rdcolmap.Po create mode 100644 jpeg-8c/.deps/rdgif.Po create mode 100644 jpeg-8c/.deps/rdjpgcom.Po create mode 100644 jpeg-8c/.deps/rdppm.Po create mode 100644 jpeg-8c/.deps/rdrle.Po create mode 100644 jpeg-8c/.deps/rdswitch.Po create mode 100644 jpeg-8c/.deps/rdtarga.Po create mode 100644 jpeg-8c/.deps/transupp.Po create mode 100644 jpeg-8c/.deps/wrbmp.Po create mode 100644 jpeg-8c/.deps/wrgif.Po create mode 100644 jpeg-8c/.deps/wrjpgcom.Po create mode 100644 jpeg-8c/.deps/wrppm.Po create mode 100644 jpeg-8c/.deps/wrrle.Po create mode 100644 jpeg-8c/.deps/wrtarga.Po create mode 100755 jpeg-8c/.libs/cjpeg create mode 100755 jpeg-8c/.libs/djpeg create mode 100755 jpeg-8c/.libs/jpegtran create mode 120000 jpeg-8c/.libs/libjpeg.la create mode 100644 jpeg-8c/.libs/libjpeg.lai create mode 120000 jpeg-8c/.libs/libjpeg.so create mode 120000 jpeg-8c/.libs/libjpeg.so.8 create mode 100755 jpeg-8c/.libs/libjpeg.so.8.3.0 create mode 100644 jpeg-8c/Makefile create mode 100644 jpeg-8c/Makefile.am create mode 100644 jpeg-8c/Makefile.in create mode 100644 jpeg-8c/README create mode 100644 jpeg-8c/aclocal.m4 create mode 100644 jpeg-8c/ansi2knr.1 create mode 100644 jpeg-8c/ansi2knr.c create mode 100644 jpeg-8c/cderror.h create mode 100644 jpeg-8c/cdjpeg.c create mode 100644 jpeg-8c/cdjpeg.h create mode 100644 jpeg-8c/change.log create mode 100755 jpeg-8c/cjpeg create mode 100644 jpeg-8c/cjpeg.1 create mode 100644 jpeg-8c/cjpeg.c create mode 100644 jpeg-8c/ckconfig.c create mode 100644 jpeg-8c/coderules.txt create mode 100755 jpeg-8c/config.guess create mode 100644 jpeg-8c/config.log create mode 100755 jpeg-8c/config.status create mode 100755 jpeg-8c/config.sub create mode 100755 jpeg-8c/configure create mode 100644 jpeg-8c/configure.ac create mode 100755 jpeg-8c/depcomp create mode 100755 jpeg-8c/djpeg create mode 100644 jpeg-8c/djpeg.1 create mode 100644 jpeg-8c/djpeg.c create mode 100644 jpeg-8c/example.c create mode 100644 jpeg-8c/filelist.txt create mode 100755 jpeg-8c/install-sh create mode 100644 jpeg-8c/install.txt create mode 100644 jpeg-8c/jaricom.c create mode 100644 jpeg-8c/jaricom.lo create mode 100644 jpeg-8c/jcapimin.c create mode 100644 jpeg-8c/jcapimin.lo create mode 100644 jpeg-8c/jcapistd.c create mode 100644 jpeg-8c/jcapistd.lo create mode 100644 jpeg-8c/jcarith.c create mode 100644 jpeg-8c/jcarith.lo create mode 100644 jpeg-8c/jccoefct.c create mode 100644 jpeg-8c/jccoefct.lo create mode 100644 jpeg-8c/jccolor.c create mode 100644 jpeg-8c/jccolor.lo create mode 100644 jpeg-8c/jcdctmgr.c create mode 100644 jpeg-8c/jcdctmgr.lo create mode 100644 jpeg-8c/jchuff.c create mode 100644 jpeg-8c/jchuff.lo create mode 100644 jpeg-8c/jcinit.c create mode 100644 jpeg-8c/jcinit.lo create mode 100644 jpeg-8c/jcmainct.c create mode 100644 jpeg-8c/jcmainct.lo create mode 100644 jpeg-8c/jcmarker.c create mode 100644 jpeg-8c/jcmarker.lo create mode 100644 jpeg-8c/jcmaster.c create mode 100644 jpeg-8c/jcmaster.lo create mode 100644 jpeg-8c/jcomapi.c create mode 100644 jpeg-8c/jcomapi.lo create mode 100644 jpeg-8c/jconfig.bcc create mode 100644 jpeg-8c/jconfig.cfg create mode 100644 jpeg-8c/jconfig.dj create mode 100644 jpeg-8c/jconfig.h create mode 100644 jpeg-8c/jconfig.mac create mode 100644 jpeg-8c/jconfig.manx create mode 100644 jpeg-8c/jconfig.mc6 create mode 100644 jpeg-8c/jconfig.sas create mode 100644 jpeg-8c/jconfig.st create mode 100644 jpeg-8c/jconfig.txt create mode 100644 jpeg-8c/jconfig.vc create mode 100644 jpeg-8c/jconfig.vms create mode 100644 jpeg-8c/jconfig.wat create mode 100644 jpeg-8c/jcparam.c create mode 100644 jpeg-8c/jcparam.lo create mode 100644 jpeg-8c/jcprepct.c create mode 100644 jpeg-8c/jcprepct.lo create mode 100644 jpeg-8c/jcsample.c create mode 100644 jpeg-8c/jcsample.lo create mode 100644 jpeg-8c/jctrans.c create mode 100644 jpeg-8c/jctrans.lo create mode 100644 jpeg-8c/jdapimin.c create mode 100644 jpeg-8c/jdapimin.lo create mode 100644 jpeg-8c/jdapistd.c create mode 100644 jpeg-8c/jdapistd.lo create mode 100644 jpeg-8c/jdarith.c create mode 100644 jpeg-8c/jdarith.lo create mode 100644 jpeg-8c/jdatadst.c create mode 100644 jpeg-8c/jdatadst.lo create mode 100644 jpeg-8c/jdatasrc.c create mode 100644 jpeg-8c/jdatasrc.lo create mode 100644 jpeg-8c/jdcoefct.c create mode 100644 jpeg-8c/jdcoefct.lo create mode 100644 jpeg-8c/jdcolor.c create mode 100644 jpeg-8c/jdcolor.lo create mode 100644 jpeg-8c/jdct.h create mode 100644 jpeg-8c/jddctmgr.c create mode 100644 jpeg-8c/jddctmgr.lo create mode 100644 jpeg-8c/jdhuff.c create mode 100644 jpeg-8c/jdhuff.lo create mode 100644 jpeg-8c/jdinput.c create mode 100644 jpeg-8c/jdinput.lo create mode 100644 jpeg-8c/jdmainct.c create mode 100644 jpeg-8c/jdmainct.lo create mode 100644 jpeg-8c/jdmarker.c create mode 100644 jpeg-8c/jdmarker.lo create mode 100644 jpeg-8c/jdmaster.c create mode 100644 jpeg-8c/jdmaster.lo create mode 100644 jpeg-8c/jdmerge.c create mode 100644 jpeg-8c/jdmerge.lo create mode 100644 jpeg-8c/jdpostct.c create mode 100644 jpeg-8c/jdpostct.lo create mode 100644 jpeg-8c/jdsample.c create mode 100644 jpeg-8c/jdsample.lo create mode 100644 jpeg-8c/jdtrans.c create mode 100644 jpeg-8c/jdtrans.lo create mode 100644 jpeg-8c/jerror.c create mode 100644 jpeg-8c/jerror.h create mode 100644 jpeg-8c/jerror.lo create mode 100644 jpeg-8c/jfdctflt.c create mode 100644 jpeg-8c/jfdctflt.lo create mode 100644 jpeg-8c/jfdctfst.c create mode 100644 jpeg-8c/jfdctfst.lo create mode 100644 jpeg-8c/jfdctint.c create mode 100644 jpeg-8c/jfdctint.lo create mode 100644 jpeg-8c/jidctflt.c create mode 100644 jpeg-8c/jidctflt.lo create mode 100644 jpeg-8c/jidctfst.c create mode 100644 jpeg-8c/jidctfst.lo create mode 100644 jpeg-8c/jidctint.c create mode 100644 jpeg-8c/jidctint.lo create mode 100644 jpeg-8c/jinclude.h create mode 100644 jpeg-8c/jmemansi.c create mode 100644 jpeg-8c/jmemdos.c create mode 100644 jpeg-8c/jmemdosa.asm create mode 100644 jpeg-8c/jmemmac.c create mode 100644 jpeg-8c/jmemmgr.c create mode 100644 jpeg-8c/jmemmgr.lo create mode 100644 jpeg-8c/jmemname.c create mode 100644 jpeg-8c/jmemnobs.c create mode 100644 jpeg-8c/jmemnobs.lo create mode 100644 jpeg-8c/jmemsys.h create mode 100644 jpeg-8c/jmorecfg.h create mode 100644 jpeg-8c/jpegint.h create mode 100644 jpeg-8c/jpeglib.h create mode 100755 jpeg-8c/jpegtran create mode 100644 jpeg-8c/jpegtran.1 create mode 100644 jpeg-8c/jpegtran.c create mode 100644 jpeg-8c/jquant1.c create mode 100644 jpeg-8c/jquant1.lo create mode 100644 jpeg-8c/jquant2.c create mode 100644 jpeg-8c/jquant2.lo create mode 100644 jpeg-8c/jutils.c create mode 100644 jpeg-8c/jutils.lo create mode 100644 jpeg-8c/jversion.h create mode 100644 jpeg-8c/libjpeg.la create mode 100644 jpeg-8c/libjpeg.map create mode 100644 jpeg-8c/libjpeg.txt create mode 100755 jpeg-8c/libtool create mode 100755 jpeg-8c/ltmain.sh create mode 100644 jpeg-8c/makcjpeg.st create mode 100644 jpeg-8c/makdjpeg.st create mode 100644 jpeg-8c/makeadsw.vc6 create mode 100644 jpeg-8c/makeasln.v10 create mode 100644 jpeg-8c/makecdep.vc6 create mode 100644 jpeg-8c/makecdsp.vc6 create mode 100644 jpeg-8c/makecfil.v10 create mode 100644 jpeg-8c/makecmak.vc6 create mode 100644 jpeg-8c/makecvcx.v10 create mode 100644 jpeg-8c/makeddep.vc6 create mode 100644 jpeg-8c/makeddsp.vc6 create mode 100644 jpeg-8c/makedfil.v10 create mode 100644 jpeg-8c/makedmak.vc6 create mode 100644 jpeg-8c/makedvcx.v10 create mode 100644 jpeg-8c/makefile.ansi create mode 100644 jpeg-8c/makefile.bcc create mode 100644 jpeg-8c/makefile.dj create mode 100644 jpeg-8c/makefile.manx create mode 100644 jpeg-8c/makefile.mc6 create mode 100644 jpeg-8c/makefile.mms create mode 100644 jpeg-8c/makefile.sas create mode 100644 jpeg-8c/makefile.unix create mode 100644 jpeg-8c/makefile.vc create mode 100644 jpeg-8c/makefile.vms create mode 100644 jpeg-8c/makefile.wat create mode 100644 jpeg-8c/makejdep.vc6 create mode 100644 jpeg-8c/makejdsp.vc6 create mode 100644 jpeg-8c/makejdsw.vc6 create mode 100644 jpeg-8c/makejfil.v10 create mode 100644 jpeg-8c/makejmak.vc6 create mode 100644 jpeg-8c/makejsln.v10 create mode 100644 jpeg-8c/makejvcx.v10 create mode 100644 jpeg-8c/makeproj.mac create mode 100644 jpeg-8c/makerdep.vc6 create mode 100644 jpeg-8c/makerdsp.vc6 create mode 100644 jpeg-8c/makerfil.v10 create mode 100644 jpeg-8c/makermak.vc6 create mode 100644 jpeg-8c/makervcx.v10 create mode 100644 jpeg-8c/maketdep.vc6 create mode 100644 jpeg-8c/maketdsp.vc6 create mode 100644 jpeg-8c/maketfil.v10 create mode 100644 jpeg-8c/maketmak.vc6 create mode 100644 jpeg-8c/maketvcx.v10 create mode 100644 jpeg-8c/makewdep.vc6 create mode 100644 jpeg-8c/makewdsp.vc6 create mode 100644 jpeg-8c/makewfil.v10 create mode 100644 jpeg-8c/makewmak.vc6 create mode 100644 jpeg-8c/makewvcx.v10 create mode 100644 jpeg-8c/makljpeg.st create mode 100644 jpeg-8c/maktjpeg.st create mode 100644 jpeg-8c/makvms.opt create mode 100755 jpeg-8c/missing create mode 100644 jpeg-8c/rdbmp.c create mode 100644 jpeg-8c/rdcolmap.c create mode 100644 jpeg-8c/rdgif.c create mode 100755 jpeg-8c/rdjpgcom create mode 100644 jpeg-8c/rdjpgcom.1 create mode 100644 jpeg-8c/rdjpgcom.c create mode 100644 jpeg-8c/rdppm.c create mode 100644 jpeg-8c/rdrle.c create mode 100644 jpeg-8c/rdswitch.c create mode 100644 jpeg-8c/rdtarga.c create mode 100644 jpeg-8c/stamp-h1 create mode 100644 jpeg-8c/structure.txt create mode 100644 jpeg-8c/testimg.bmp create mode 100644 jpeg-8c/testimg.jpg create mode 100644 jpeg-8c/testimg.ppm create mode 100644 jpeg-8c/testimgp.jpg create mode 100644 jpeg-8c/testorig.jpg create mode 100644 jpeg-8c/testprog.jpg create mode 100644 jpeg-8c/transupp.c create mode 100644 jpeg-8c/transupp.h create mode 100644 jpeg-8c/usage.txt create mode 100644 jpeg-8c/wizard.txt create mode 100644 jpeg-8c/wrbmp.c create mode 100644 jpeg-8c/wrgif.c create mode 100755 jpeg-8c/wrjpgcom create mode 100644 jpeg-8c/wrjpgcom.1 create mode 100644 jpeg-8c/wrjpgcom.c create mode 100644 jpeg-8c/wrppm.c create mode 100644 jpeg-8c/wrrle.c create mode 100644 jpeg-8c/wrtarga.c create mode 100644 jpegsrc.v8c.tar.gz create mode 100644 password_reset/__init__.py create mode 100644 password_reset/forms.py create mode 100644 password_reset/locale/de/LC_MESSAGES/django.mo create mode 100644 password_reset/locale/de/LC_MESSAGES/django.po create mode 100644 password_reset/locale/es/LC_MESSAGES/django.mo create mode 100644 password_reset/locale/es/LC_MESSAGES/django.po create mode 100644 password_reset/locale/ka/LC_MESSAGES/django.mo create mode 100644 password_reset/locale/ka/LC_MESSAGES/django.po create mode 100644 password_reset/locale/nb/LC_MESSAGES/django.mo create mode 100644 password_reset/locale/nb/LC_MESSAGES/django.po create mode 100644 password_reset/locale/pl/LC_MESSAGES/django.mo create mode 100644 password_reset/locale/pl/LC_MESSAGES/django.po create mode 100644 password_reset/locale/ru/LC_MESSAGES/django.mo create mode 100644 password_reset/locale/ru/LC_MESSAGES/django.po create mode 100644 password_reset/locale/zh/LC_MESSAGES/django.mo create mode 100644 password_reset/locale/zh/LC_MESSAGES/django.po create mode 100644 password_reset/signals.py create mode 100644 password_reset/templates/password_reset/base.html create mode 100644 password_reset/templates/password_reset/recovery_done.html create mode 100644 password_reset/templates/password_reset/recovery_email.txt create mode 100644 password_reset/templates/password_reset/recovery_email_subject.txt create mode 100644 password_reset/templates/password_reset/recovery_form.html create mode 100644 password_reset/templates/password_reset/reset.html create mode 100644 password_reset/templates/password_reset/reset_sent.html create mode 100644 password_reset/tests/__init__.py create mode 100644 password_reset/tests/models.py create mode 100644 password_reset/tests/settings.py create mode 100644 password_reset/tests/templates/404.html create mode 100644 password_reset/tests/templates/base.html create mode 100644 password_reset/tests/tests.py create mode 100644 password_reset/tests/urls.py create mode 100644 password_reset/tests/views.py create mode 100644 password_reset/urls.py create mode 100644 password_reset/utils.py create mode 100644 password_reset/views.py create mode 100644 photologue/__init__.py create mode 100644 photologue/admin.py create mode 100644 photologue/contrib/old_style_templates/templates/photologue/gallery_archive.html create mode 100644 photologue/contrib/old_style_templates/templates/photologue/gallery_archive_day.html create mode 100644 photologue/contrib/old_style_templates/templates/photologue/gallery_archive_month.html create mode 100644 photologue/contrib/old_style_templates/templates/photologue/gallery_archive_year.html create mode 100644 photologue/contrib/old_style_templates/templates/photologue/gallery_detail.html create mode 100644 photologue/contrib/old_style_templates/templates/photologue/gallery_list.html create mode 100644 photologue/contrib/old_style_templates/templates/photologue/photo_archive.html create mode 100644 photologue/contrib/old_style_templates/templates/photologue/photo_archive_day.html create mode 100644 photologue/contrib/old_style_templates/templates/photologue/photo_archive_month.html create mode 100644 photologue/contrib/old_style_templates/templates/photologue/photo_archive_year.html create mode 100644 photologue/contrib/old_style_templates/templates/photologue/photo_detail.html create mode 100644 photologue/contrib/old_style_templates/templates/photologue/photo_list.html create mode 100644 photologue/contrib/old_style_templates/templates/photologue/root.html create mode 100644 photologue/contrib/old_style_templates/templates/photologue/tags/next_in_gallery.html create mode 100644 photologue/contrib/old_style_templates/templates/photologue/tags/prev_in_gallery.html create mode 100644 photologue/locale/cs/LC_MESSAGES/django.mo create mode 100644 photologue/locale/cs/LC_MESSAGES/django.po create mode 100644 photologue/locale/da/LC_MESSAGES/django.mo create mode 100644 photologue/locale/da/LC_MESSAGES/django.po create mode 100644 photologue/locale/de/LC_MESSAGES/django.mo create mode 100644 photologue/locale/de/LC_MESSAGES/django.po create mode 100644 photologue/locale/en/LC_MESSAGES/django.mo create mode 100644 photologue/locale/en/LC_MESSAGES/django.po create mode 100644 photologue/locale/en_US/LC_MESSAGES/django.mo create mode 100644 photologue/locale/en_US/LC_MESSAGES/django.po create mode 100644 photologue/locale/es_ES/LC_MESSAGES/django.mo create mode 100644 photologue/locale/es_ES/LC_MESSAGES/django.po create mode 100644 photologue/locale/eu/LC_MESSAGES/django.mo create mode 100644 photologue/locale/eu/LC_MESSAGES/django.po create mode 100644 photologue/locale/fr/LC_MESSAGES/django.mo create mode 100644 photologue/locale/fr/LC_MESSAGES/django.po create mode 100644 photologue/locale/hu/LC_MESSAGES/django.mo create mode 100644 photologue/locale/hu/LC_MESSAGES/django.po create mode 100644 photologue/locale/it/LC_MESSAGES/django.mo create mode 100644 photologue/locale/it/LC_MESSAGES/django.po create mode 100644 photologue/locale/nl/LC_MESSAGES/django.mo create mode 100644 photologue/locale/nl/LC_MESSAGES/django.po create mode 100644 photologue/locale/no/LC_MESSAGES/django.mo create mode 100644 photologue/locale/no/LC_MESSAGES/django.po create mode 100644 photologue/locale/pl/LC_MESSAGES/django.mo create mode 100644 photologue/locale/pl/LC_MESSAGES/django.po create mode 100644 photologue/locale/pt/LC_MESSAGES/django.mo create mode 100644 photologue/locale/pt/LC_MESSAGES/django.po create mode 100644 photologue/locale/pt_BR/LC_MESSAGES/django.mo create mode 100644 photologue/locale/pt_BR/LC_MESSAGES/django.po create mode 100644 photologue/locale/ru/LC_MESSAGES/django.mo create mode 100644 photologue/locale/ru/LC_MESSAGES/django.po create mode 100644 photologue/locale/sk/LC_MESSAGES/django.mo create mode 100644 photologue/locale/sk/LC_MESSAGES/django.po create mode 100644 photologue/locale/tr/LC_MESSAGES/django.mo create mode 100644 photologue/locale/tr/LC_MESSAGES/django.po create mode 100644 photologue/management/__init__.py create mode 100644 photologue/management/commands/__init__.py create mode 100644 photologue/management/commands/plcache.py create mode 100644 photologue/management/commands/plcreatesize.py create mode 100644 photologue/management/commands/plflush.py create mode 100644 photologue/managers.py create mode 100644 photologue/migrations/0001_initial.py create mode 100644 photologue/migrations/0002_photosize_data.py create mode 100644 photologue/migrations/0003_auto_20140822_1716.py create mode 100644 photologue/migrations/__init__.py create mode 100644 photologue/models.py create mode 100644 photologue/res/sample.jpg create mode 100644 photologue/res/test_photologue_"ing.jpg create mode 100644 photologue/res/test_photologue_landscape.jpg create mode 100644 photologue/res/test_photologue_portrait.jpg create mode 100644 photologue/res/test_photologue_square.jpg create mode 100644 photologue/res/zips/ignored_files.zip create mode 100644 photologue/res/zips/not_image.zip create mode 100644 photologue/res/zips/sample.zip create mode 100644 photologue/sitemaps.py create mode 100644 photologue/south_migrations/0001_initial.py create mode 100644 photologue/south_migrations/0002_auto__chg_field_gallery_title__chg_field_galleryupload_title__chg_fiel.py create mode 100644 photologue/south_migrations/0003_auto__chg_field_photosize_name.py create mode 100644 photologue/south_migrations/0004_initial_photosizes.py create mode 100644 photologue/south_migrations/0005_auto_28.py create mode 100644 photologue/south_migrations/0006_data_28.py create mode 100644 photologue/south_migrations/0007_auto__chg_field_galleryupload_title.py create mode 100644 photologue/south_migrations/__init__.py create mode 100644 photologue/templates/photologue/gallery_archive.html create mode 100644 photologue/templates/photologue/gallery_archive_day.html create mode 100644 photologue/templates/photologue/gallery_archive_month.html create mode 100644 photologue/templates/photologue/gallery_archive_year.html create mode 100644 photologue/templates/photologue/gallery_detail.html create mode 100644 photologue/templates/photologue/gallery_list.html create mode 100644 photologue/templates/photologue/includes/gallery_sample.html create mode 100644 photologue/templates/photologue/includes/paginator.html create mode 100644 photologue/templates/photologue/photo_archive.html create mode 100644 photologue/templates/photologue/photo_archive_day.html create mode 100644 photologue/templates/photologue/photo_archive_month.html create mode 100644 photologue/templates/photologue/photo_archive_year.html create mode 100644 photologue/templates/photologue/photo_detail.html create mode 100644 photologue/templates/photologue/photo_list.html create mode 100644 photologue/templates/photologue/root.html create mode 100644 photologue/templates/photologue/tags/next_in_gallery.html create mode 100644 photologue/templates/photologue/tags/prev_in_gallery.html create mode 100644 photologue/templatetags/__init__.py create mode 100644 photologue/templatetags/photologue_tags.py create mode 100644 photologue/tests/__init__.py create mode 100644 photologue/tests/factories.py create mode 100644 photologue/tests/helpers.py create mode 100644 photologue/tests/templates/base.html create mode 100644 photologue/tests/test_effect.py create mode 100644 photologue/tests/test_gallery.py create mode 100644 photologue/tests/test_photo.py create mode 100644 photologue/tests/test_photosize.py create mode 100644 photologue/tests/test_resize.py create mode 100644 photologue/tests/test_sitemap.py create mode 100644 photologue/tests/test_sites.py create mode 100644 photologue/tests/test_urls.py create mode 100644 photologue/tests/test_views_gallery.py create mode 100644 photologue/tests/test_views_photo.py create mode 100644 photologue/tests/test_zipupload.py create mode 100644 photologue/urls.py create mode 100644 photologue/utils/EXIF.py create mode 100644 photologue/utils/__init__.py create mode 100644 photologue/utils/reflection.py create mode 100644 photologue/utils/watermark.py create mode 100644 photologue/views.py create mode 100644 static/client/css/pages/exposition_by.css create mode 100644 static/client/js/pages/complete_registration.js create mode 100644 static/css/pages/exposition_by.css create mode 100644 static/ninjaplugin/plugin/index.html create mode 100644 static/ninjaplugin/plugin/init.js create mode 100644 static/ninjaplugin/plugin/jquery.mousewheel.js create mode 100644 static/ninjaplugin/plugin/plugin.css create mode 100644 static/ninjaplugin/plugin/plugin.js create mode 100644 templates/client/exposition/exposition_by.html create mode 100644 templates/client/password_reset/base.html create mode 100644 templates/client/password_reset/recovery_done.html create mode 100644 templates/client/password_reset/reset.html create mode 100644 templates/client/password_reset/reset_sent.html create mode 100644 templates/client/popups/pswd_recovery.html create mode 100644 templates/client/popups/reg_send.html create mode 100644 templates/client/popups/user_information.html create mode 100644 templates/client/test_plugin.html diff --git a/accounts/edit_forms.py b/accounts/edit_forms.py index ceff005c..8f484635 100644 --- a/accounts/edit_forms.py +++ b/accounts/edit_forms.py @@ -59,7 +59,7 @@ class HomeForm(forms.ModelForm): class WorkForm(forms.ModelForm): position = forms.CharField(label=_(u'Укажите вашу должность'), - required=False) + required=False, widget=forms.TextInput(attrs={'style': 'height: 42px;'})) company = forms.CharField(label=_(u'Место работы'), widget=forms.HiddenInput(attrs={'class': 'select2'})) def __init__(self, *args, **kwargs): diff --git a/accounts/forms.py b/accounts/forms.py index f2a881ec..f00557f8 100644 --- a/accounts/forms.py +++ b/accounts/forms.py @@ -3,13 +3,13 @@ from django import forms from django.contrib.auth.forms import ReadOnlyPasswordHashField from django.forms.util import ErrorList from django.utils.translation import ugettext as _ -from models import User +from models import User, Profile from country.models import Country from city.models import City from company.models import Company from organiser.models import Organiser #functions -from functions.form_check import translit_with_separator +from functions.form_check import translit_with_separator, is_latin class UserCreationForm(forms.ModelForm): password1 = forms.CharField(label='Пароль', widget=forms.PasswordInput(render_value=False)) @@ -157,3 +157,78 @@ class EmailAnnouncementForm(forms.Form): (2, _(u'Получать обзор событий')), (3, _(u'Получать новости'))] announcement = forms.MultipleChoiceField(choices=data, widget=forms.CheckboxSelectMultiple()) + + +class RegistrationCompleteForm(forms.ModelForm): + country = forms.ChoiceField(label='Страна', choices=[(c.id, c.name) for c in Country.objects.all()], + widget=forms.Select(attrs={'class': 'select2'})) + city = forms.CharField(label='Город', widget=forms.HiddenInput()) + url = forms.CharField(widget=forms.TextInput(attrs={'placeholder': _(u'адрес страны(обязательно)')})) + + code_country = forms.ChoiceField(label=_(u'код страны'), initial='70', + choices=[(str(c.phone_code), '+'+str(c.phone_code)) for c in Country.objects.all() if c.phone_code is not None], + widget=forms.Select(attrs={'class': 'select2'})) + code_city = forms.CharField(label=_(u'код города')) + phone = forms.CharField(label=_(u'ваш номер')) + class Meta: + model = User + fields = ('url',) + + + def save(self, force_insert=False, force_update=False, commit=True): + user = super(RegistrationCompleteForm, self).save(commit=False) + data = self.cleaned_data + phone = data['code_country']+data['code_city']+data['phone'] + + user.profile.phone = int(phone) + user.profile.country = data['country'] + user.profile.city = data['city'] + user.profile.save() + + if commit: + user.save() + return user + + def clean_city(self): + try: + return City.objects.get(id=self.cleaned_data['city']) + except City.DoesNotExist: + return None + + + def clean_country(self): + try: + return Country.objects.get(id=self.cleaned_data['country']) + except City.DoesNotExist: + return None + + def clean_url(self): + url = self.cleaned_data['url'] + if not is_latin(url): + raise forms.ValidationError(_(u'url должен состоять только из латинских букв')) + + try: + User.objects.get(url=url) + raise forms.ValidationError(_(u'Пользователь с таким url уже существует')) + except User.DoesNotExist: + return url + + + + +class RecoveryForm(forms.Form): + email = forms.EmailField(widget=forms.TextInput(attrs={'placeholder': _(u'Email')})) + + def get_user(self): + email = self.cleaned_data['email'] + return User.objects.get(email=email) + + def clean_email(self): + email = self.cleaned_data['email'] + try: + return User.objects.get(email=email) + except User.DoesNotExist: + raise forms.ValidationError(_(u'Пользователь с таким емейлом не зарегестрирован')) + + + diff --git a/city/models.py b/city/models.py index 90a4c7c5..ae446d6e 100644 --- a/city/models.py +++ b/city/models.py @@ -81,6 +81,10 @@ class City(TranslatableModel): def places_catalog(self): return PlaceExposition.catalog+'city-%s'%self.url + def expositions_number(self): + + return len(Exposition.objects.filter(city=self.id)) + diff --git a/city/views.py b/city/views.py index 43718229..9074e6d8 100644 --- a/city/views.py +++ b/city/views.py @@ -15,9 +15,9 @@ def get_city(request): country = request.GET['country'] term = request.GET['term'].capitalize() if not term: - qs = City.objects.language().filter(country=country).order_by('translations__name')[:100] + qs = City.objects.language().filter(country=country).order_by('translations__name').distinct()[:100] else: - qs = City.objects.language().filter(country=country, translations__name__contains=term) + qs = City.objects.language().filter(country=country, translations__name__contains=term).distinct() result = [{'id': city.id, 'label': city.name} for city in qs] return HttpResponse(json.dumps(result), content_type='application/json') diff --git a/company/edit_forms.py b/company/edit_forms.py index d0a397de..e17eb776 100644 --- a/company/edit_forms.py +++ b/company/edit_forms.py @@ -19,7 +19,7 @@ class NameForm(BaseForm): class SpecializationForm(BaseForm): translation = True - specialization = forms.CharField(label=_(u'Описание компании')) + specialization = forms.CharField(label=_(u'Описание компании'), widget=forms.TextInput(attrs={'style': 'width: 420px;'})) class Meta: model = Company._meta.translations_model fields = ('specialization',) @@ -106,14 +106,15 @@ class StaffForm(BaseForm): class DescriptionForm(BaseForm): translation = True - description = forms.CharField(label=_(u'Подробное описание компании')) + description = forms.CharField(label=_(u'Подробное описание компании'), widget=forms.Textarea(attrs={'cols':'30'}), + required=False) class Meta: model = Company._meta.translations_model fields = ('description',) class AddressForm(BaseForm): translation = True - address_inf = forms.CharField(label=_(u'Адрес компании')) + address_inf = forms.CharField(label=_(u'Адрес компании'), widget=forms.TextInput(attrs={'style': 'width: 420px;'})) class Meta: model = Company._meta.translations_model fields = ('address_inf',) diff --git a/company/forms.py b/company/forms.py index 97fd0186..b2d7630d 100644 --- a/company/forms.py +++ b/company/forms.py @@ -13,7 +13,7 @@ from theme.models import Theme from city.models import City #functions from functions.translate import fill_with_signal -from functions.form_check import is_positive_integer, translit_with_separator +from functions.form_check import is_positive_integer, translit_with_separator, is_latin from functions.files import check_tmp_files from functions.custom_fields import LocationWidget @@ -261,7 +261,7 @@ class CompanyFormClient(forms.Form): class CreateCompanyForm(forms.Form): action = '/company/create-company/' name = forms.CharField(widget=forms.TextInput(attrs={'placeholder': _(u'Введите название компании')})) - url = forms.CharField(widget=forms.TextInput(attrs={'placeholder': _(u'Введите урл')})) + url = forms.CharField(widget=forms.TextInput(attrs={'placeholder': _(u'Введите url(только латиница)')})) theme = forms.ModelMultipleChoiceField(queryset=Theme.objects.all()) def save(self, user): @@ -280,7 +280,9 @@ class CreateCompanyForm(forms.Form): def clean_url(self): - url = self.cleaned_data.get('url') + url = self.cleaned_data['url'] + if not is_latin(url): + raise forms.ValidationError(_(u'url должен состоять только из латинских букв')) company = Company.objects.filter(url=translit_with_separator(url)) if company: diff --git a/country/models.py b/country/models.py index 68ec685c..82812e63 100644 --- a/country/models.py +++ b/country/models.py @@ -121,6 +121,10 @@ class Country(TranslatableModel): def places_catalog(self): return PlaceExposition.catalog+'country-%s'%self.url + def expositions_number(self): + + return len(Exposition.objects.filter(country=self.id)) + post_save.connect(post_save_handler, sender=Country) \ No newline at end of file diff --git a/exposition/views.py b/exposition/views.py index e9bcff9f..999ba1af 100644 --- a/exposition/views.py +++ b/exposition/views.py @@ -30,9 +30,25 @@ class ExpositionByCountry(ListView): .filter(exposition_country__country__isnull=False, translations__language_code=lang)\ .order_by('translations__name').distinct() -class ExpositionByTheme(ListView): + +class ExpositionBy(ListView): + template_name = 'exposition/exposition_by.html' + title1 = '' + title2 = '' + """ + abstact class + """ + def get_context_data(self, **kwargs): + context = super(ExpositionBy, self).get_context_data(**kwargs) + context.update({'title1': self.title1, 'title2': self.title2}) + + return context + + +class ExpositionByTheme(ExpositionBy): model = Theme - template_name = 'exposition/exposition_by_theme.html' + title1 = _(u'По тематикам') + title2 = _(u'Выставки мира по тематикам') def get_queryset(self): lang = translation.get_language() @@ -41,9 +57,12 @@ class ExpositionByTheme(ListView): .order_by('translations__name').distinct() -class ExpositionByCity(ListView): + + +class ExpositionByCity(ExpositionBy): model = City - template_name = 'exposition/exposition_by_city.html' + title1 = _(u'По городам') + title2 = _(u'Выставки мира по городам') def get_queryset(self): lang = translation.get_language() diff --git a/functions/form_check.py b/functions/form_check.py index 5a834b8c..b815c239 100644 --- a/functions/form_check.py +++ b/functions/form_check.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import unicodedata as ud from django.core.exceptions import ValidationError import pytils, re @@ -40,4 +41,17 @@ def translit_with_separator(string, separator='-'): st = st[:-1] - return st.lower() \ No newline at end of file + return st.lower() + + + +def is_latin_char(uchr): + latin_letters= {} + try: return latin_letters[uchr] + except KeyError: + return latin_letters.setdefault(uchr, 'LATIN' in ud.name(uchr)) + +def is_latin(unistr): + return all(is_latin_char(uchr) + for uchr in unistr + if uchr.isalpha()) diff --git a/jpeg-8c/.deps/cdjpeg.Po b/jpeg-8c/.deps/cdjpeg.Po new file mode 100644 index 00000000..0c54c7eb --- /dev/null +++ b/jpeg-8c/.deps/cdjpeg.Po @@ -0,0 +1,116 @@ +cdjpeg.o: cdjpeg.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h /usr/include/ctype.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: + +/usr/include/ctype.h: diff --git a/jpeg-8c/.deps/cjpeg.Po b/jpeg-8c/.deps/cjpeg.Po new file mode 100644 index 00000000..7050097a --- /dev/null +++ b/jpeg-8c/.deps/cjpeg.Po @@ -0,0 +1,116 @@ +cjpeg.o: cjpeg.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h jversion.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: + +jversion.h: diff --git a/jpeg-8c/.deps/djpeg.Po b/jpeg-8c/.deps/djpeg.Po new file mode 100644 index 00000000..d9461666 --- /dev/null +++ b/jpeg-8c/.deps/djpeg.Po @@ -0,0 +1,118 @@ +djpeg.o: djpeg.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h jversion.h /usr/include/ctype.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: + +jversion.h: + +/usr/include/ctype.h: diff --git a/jpeg-8c/.deps/jaricom.Plo b/jpeg-8c/.deps/jaricom.Plo new file mode 100644 index 00000000..3c0b0c09 --- /dev/null +++ b/jpeg-8c/.deps/jaricom.Plo @@ -0,0 +1,112 @@ +jaricom.lo: jaricom.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jcapimin.Plo b/jpeg-8c/.deps/jcapimin.Plo new file mode 100644 index 00000000..67814365 --- /dev/null +++ b/jpeg-8c/.deps/jcapimin.Plo @@ -0,0 +1,112 @@ +jcapimin.lo: jcapimin.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jcapistd.Plo b/jpeg-8c/.deps/jcapistd.Plo new file mode 100644 index 00000000..2077bb91 --- /dev/null +++ b/jpeg-8c/.deps/jcapistd.Plo @@ -0,0 +1,112 @@ +jcapistd.lo: jcapistd.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jcarith.Plo b/jpeg-8c/.deps/jcarith.Plo new file mode 100644 index 00000000..8fa6932b --- /dev/null +++ b/jpeg-8c/.deps/jcarith.Plo @@ -0,0 +1,112 @@ +jcarith.lo: jcarith.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jccoefct.Plo b/jpeg-8c/.deps/jccoefct.Plo new file mode 100644 index 00000000..aafb0d48 --- /dev/null +++ b/jpeg-8c/.deps/jccoefct.Plo @@ -0,0 +1,112 @@ +jccoefct.lo: jccoefct.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jccolor.Plo b/jpeg-8c/.deps/jccolor.Plo new file mode 100644 index 00000000..ab335d2c --- /dev/null +++ b/jpeg-8c/.deps/jccolor.Plo @@ -0,0 +1,112 @@ +jccolor.lo: jccolor.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jcdctmgr.Plo b/jpeg-8c/.deps/jcdctmgr.Plo new file mode 100644 index 00000000..6b16c714 --- /dev/null +++ b/jpeg-8c/.deps/jcdctmgr.Plo @@ -0,0 +1,114 @@ +jcdctmgr.lo: jcdctmgr.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h jdct.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: + +jdct.h: diff --git a/jpeg-8c/.deps/jchuff.Plo b/jpeg-8c/.deps/jchuff.Plo new file mode 100644 index 00000000..250e9303 --- /dev/null +++ b/jpeg-8c/.deps/jchuff.Plo @@ -0,0 +1,112 @@ +jchuff.lo: jchuff.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jcinit.Plo b/jpeg-8c/.deps/jcinit.Plo new file mode 100644 index 00000000..e017e02a --- /dev/null +++ b/jpeg-8c/.deps/jcinit.Plo @@ -0,0 +1,112 @@ +jcinit.lo: jcinit.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jcmainct.Plo b/jpeg-8c/.deps/jcmainct.Plo new file mode 100644 index 00000000..0a0adc7c --- /dev/null +++ b/jpeg-8c/.deps/jcmainct.Plo @@ -0,0 +1,112 @@ +jcmainct.lo: jcmainct.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jcmarker.Plo b/jpeg-8c/.deps/jcmarker.Plo new file mode 100644 index 00000000..14ba062a --- /dev/null +++ b/jpeg-8c/.deps/jcmarker.Plo @@ -0,0 +1,112 @@ +jcmarker.lo: jcmarker.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jcmaster.Plo b/jpeg-8c/.deps/jcmaster.Plo new file mode 100644 index 00000000..18b9d97f --- /dev/null +++ b/jpeg-8c/.deps/jcmaster.Plo @@ -0,0 +1,112 @@ +jcmaster.lo: jcmaster.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jcomapi.Plo b/jpeg-8c/.deps/jcomapi.Plo new file mode 100644 index 00000000..db3288b9 --- /dev/null +++ b/jpeg-8c/.deps/jcomapi.Plo @@ -0,0 +1,112 @@ +jcomapi.lo: jcomapi.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jcparam.Plo b/jpeg-8c/.deps/jcparam.Plo new file mode 100644 index 00000000..7935156d --- /dev/null +++ b/jpeg-8c/.deps/jcparam.Plo @@ -0,0 +1,112 @@ +jcparam.lo: jcparam.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jcprepct.Plo b/jpeg-8c/.deps/jcprepct.Plo new file mode 100644 index 00000000..18020ece --- /dev/null +++ b/jpeg-8c/.deps/jcprepct.Plo @@ -0,0 +1,112 @@ +jcprepct.lo: jcprepct.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jcsample.Plo b/jpeg-8c/.deps/jcsample.Plo new file mode 100644 index 00000000..45ca862e --- /dev/null +++ b/jpeg-8c/.deps/jcsample.Plo @@ -0,0 +1,112 @@ +jcsample.lo: jcsample.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jctrans.Plo b/jpeg-8c/.deps/jctrans.Plo new file mode 100644 index 00000000..d57a0974 --- /dev/null +++ b/jpeg-8c/.deps/jctrans.Plo @@ -0,0 +1,112 @@ +jctrans.lo: jctrans.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jdapimin.Plo b/jpeg-8c/.deps/jdapimin.Plo new file mode 100644 index 00000000..cdeee60c --- /dev/null +++ b/jpeg-8c/.deps/jdapimin.Plo @@ -0,0 +1,112 @@ +jdapimin.lo: jdapimin.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jdapistd.Plo b/jpeg-8c/.deps/jdapistd.Plo new file mode 100644 index 00000000..1755a537 --- /dev/null +++ b/jpeg-8c/.deps/jdapistd.Plo @@ -0,0 +1,112 @@ +jdapistd.lo: jdapistd.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jdarith.Plo b/jpeg-8c/.deps/jdarith.Plo new file mode 100644 index 00000000..d5348e7e --- /dev/null +++ b/jpeg-8c/.deps/jdarith.Plo @@ -0,0 +1,112 @@ +jdarith.lo: jdarith.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jdatadst.Plo b/jpeg-8c/.deps/jdatadst.Plo new file mode 100644 index 00000000..6d2a69ad --- /dev/null +++ b/jpeg-8c/.deps/jdatadst.Plo @@ -0,0 +1,110 @@ +jdatadst.lo: jdatadst.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jdatasrc.Plo b/jpeg-8c/.deps/jdatasrc.Plo new file mode 100644 index 00000000..d5965b2f --- /dev/null +++ b/jpeg-8c/.deps/jdatasrc.Plo @@ -0,0 +1,110 @@ +jdatasrc.lo: jdatasrc.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jdcoefct.Plo b/jpeg-8c/.deps/jdcoefct.Plo new file mode 100644 index 00000000..db815a82 --- /dev/null +++ b/jpeg-8c/.deps/jdcoefct.Plo @@ -0,0 +1,112 @@ +jdcoefct.lo: jdcoefct.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jdcolor.Plo b/jpeg-8c/.deps/jdcolor.Plo new file mode 100644 index 00000000..7b7ce5b4 --- /dev/null +++ b/jpeg-8c/.deps/jdcolor.Plo @@ -0,0 +1,112 @@ +jdcolor.lo: jdcolor.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jddctmgr.Plo b/jpeg-8c/.deps/jddctmgr.Plo new file mode 100644 index 00000000..958bc5da --- /dev/null +++ b/jpeg-8c/.deps/jddctmgr.Plo @@ -0,0 +1,114 @@ +jddctmgr.lo: jddctmgr.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h jdct.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: + +jdct.h: diff --git a/jpeg-8c/.deps/jdhuff.Plo b/jpeg-8c/.deps/jdhuff.Plo new file mode 100644 index 00000000..02a429f2 --- /dev/null +++ b/jpeg-8c/.deps/jdhuff.Plo @@ -0,0 +1,112 @@ +jdhuff.lo: jdhuff.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jdinput.Plo b/jpeg-8c/.deps/jdinput.Plo new file mode 100644 index 00000000..e4e8f7df --- /dev/null +++ b/jpeg-8c/.deps/jdinput.Plo @@ -0,0 +1,112 @@ +jdinput.lo: jdinput.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jdmainct.Plo b/jpeg-8c/.deps/jdmainct.Plo new file mode 100644 index 00000000..c696078f --- /dev/null +++ b/jpeg-8c/.deps/jdmainct.Plo @@ -0,0 +1,112 @@ +jdmainct.lo: jdmainct.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jdmarker.Plo b/jpeg-8c/.deps/jdmarker.Plo new file mode 100644 index 00000000..c6ce8567 --- /dev/null +++ b/jpeg-8c/.deps/jdmarker.Plo @@ -0,0 +1,112 @@ +jdmarker.lo: jdmarker.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jdmaster.Plo b/jpeg-8c/.deps/jdmaster.Plo new file mode 100644 index 00000000..c27d2d2a --- /dev/null +++ b/jpeg-8c/.deps/jdmaster.Plo @@ -0,0 +1,112 @@ +jdmaster.lo: jdmaster.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jdmerge.Plo b/jpeg-8c/.deps/jdmerge.Plo new file mode 100644 index 00000000..83ad94bb --- /dev/null +++ b/jpeg-8c/.deps/jdmerge.Plo @@ -0,0 +1,112 @@ +jdmerge.lo: jdmerge.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jdpostct.Plo b/jpeg-8c/.deps/jdpostct.Plo new file mode 100644 index 00000000..dd7a97d4 --- /dev/null +++ b/jpeg-8c/.deps/jdpostct.Plo @@ -0,0 +1,112 @@ +jdpostct.lo: jdpostct.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jdsample.Plo b/jpeg-8c/.deps/jdsample.Plo new file mode 100644 index 00000000..bae5a354 --- /dev/null +++ b/jpeg-8c/.deps/jdsample.Plo @@ -0,0 +1,112 @@ +jdsample.lo: jdsample.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jdtrans.Plo b/jpeg-8c/.deps/jdtrans.Plo new file mode 100644 index 00000000..85641b5c --- /dev/null +++ b/jpeg-8c/.deps/jdtrans.Plo @@ -0,0 +1,112 @@ +jdtrans.lo: jdtrans.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jerror.Plo b/jpeg-8c/.deps/jerror.Plo new file mode 100644 index 00000000..00810b10 --- /dev/null +++ b/jpeg-8c/.deps/jerror.Plo @@ -0,0 +1,112 @@ +jerror.lo: jerror.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jversion.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jversion.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jfdctflt.Plo b/jpeg-8c/.deps/jfdctflt.Plo new file mode 100644 index 00000000..c7003f06 --- /dev/null +++ b/jpeg-8c/.deps/jfdctflt.Plo @@ -0,0 +1,114 @@ +jfdctflt.lo: jfdctflt.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h jdct.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: + +jdct.h: diff --git a/jpeg-8c/.deps/jfdctfst.Plo b/jpeg-8c/.deps/jfdctfst.Plo new file mode 100644 index 00000000..95c1f079 --- /dev/null +++ b/jpeg-8c/.deps/jfdctfst.Plo @@ -0,0 +1,114 @@ +jfdctfst.lo: jfdctfst.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h jdct.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: + +jdct.h: diff --git a/jpeg-8c/.deps/jfdctint.Plo b/jpeg-8c/.deps/jfdctint.Plo new file mode 100644 index 00000000..5074650e --- /dev/null +++ b/jpeg-8c/.deps/jfdctint.Plo @@ -0,0 +1,114 @@ +jfdctint.lo: jfdctint.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h jdct.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: + +jdct.h: diff --git a/jpeg-8c/.deps/jidctflt.Plo b/jpeg-8c/.deps/jidctflt.Plo new file mode 100644 index 00000000..c814710b --- /dev/null +++ b/jpeg-8c/.deps/jidctflt.Plo @@ -0,0 +1,114 @@ +jidctflt.lo: jidctflt.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h jdct.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: + +jdct.h: diff --git a/jpeg-8c/.deps/jidctfst.Plo b/jpeg-8c/.deps/jidctfst.Plo new file mode 100644 index 00000000..6c39d634 --- /dev/null +++ b/jpeg-8c/.deps/jidctfst.Plo @@ -0,0 +1,114 @@ +jidctfst.lo: jidctfst.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h jdct.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: + +jdct.h: diff --git a/jpeg-8c/.deps/jidctint.Plo b/jpeg-8c/.deps/jidctint.Plo new file mode 100644 index 00000000..4828cbb2 --- /dev/null +++ b/jpeg-8c/.deps/jidctint.Plo @@ -0,0 +1,114 @@ +jidctint.lo: jidctint.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h jdct.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: + +jdct.h: diff --git a/jpeg-8c/.deps/jmemmgr.Plo b/jpeg-8c/.deps/jmemmgr.Plo new file mode 100644 index 00000000..0fd0939b --- /dev/null +++ b/jpeg-8c/.deps/jmemmgr.Plo @@ -0,0 +1,114 @@ +jmemmgr.lo: jmemmgr.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h jmemsys.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: + +jmemsys.h: diff --git a/jpeg-8c/.deps/jmemnobs.Plo b/jpeg-8c/.deps/jmemnobs.Plo new file mode 100644 index 00000000..3fe6b274 --- /dev/null +++ b/jpeg-8c/.deps/jmemnobs.Plo @@ -0,0 +1,114 @@ +jmemnobs.lo: jmemnobs.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h jmemsys.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: + +jmemsys.h: diff --git a/jpeg-8c/.deps/jpegtran.Po b/jpeg-8c/.deps/jpegtran.Po new file mode 100644 index 00000000..e61070ec --- /dev/null +++ b/jpeg-8c/.deps/jpegtran.Po @@ -0,0 +1,118 @@ +jpegtran.o: jpegtran.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h transupp.h jversion.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: + +transupp.h: + +jversion.h: diff --git a/jpeg-8c/.deps/jquant1.Plo b/jpeg-8c/.deps/jquant1.Plo new file mode 100644 index 00000000..3e47d1aa --- /dev/null +++ b/jpeg-8c/.deps/jquant1.Plo @@ -0,0 +1,112 @@ +jquant1.lo: jquant1.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jquant2.Plo b/jpeg-8c/.deps/jquant2.Plo new file mode 100644 index 00000000..4f7e7e01 --- /dev/null +++ b/jpeg-8c/.deps/jquant2.Plo @@ -0,0 +1,112 @@ +jquant2.lo: jquant2.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/jutils.Plo b/jpeg-8c/.deps/jutils.Plo new file mode 100644 index 00000000..97e7bd2d --- /dev/null +++ b/jpeg-8c/.deps/jutils.Plo @@ -0,0 +1,112 @@ +jutils.lo: jutils.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: diff --git a/jpeg-8c/.deps/rdbmp.Po b/jpeg-8c/.deps/rdbmp.Po new file mode 100644 index 00000000..bfc65022 --- /dev/null +++ b/jpeg-8c/.deps/rdbmp.Po @@ -0,0 +1,114 @@ +rdbmp.o: rdbmp.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: diff --git a/jpeg-8c/.deps/rdcolmap.Po b/jpeg-8c/.deps/rdcolmap.Po new file mode 100644 index 00000000..f2d010e6 --- /dev/null +++ b/jpeg-8c/.deps/rdcolmap.Po @@ -0,0 +1,114 @@ +rdcolmap.o: rdcolmap.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: diff --git a/jpeg-8c/.deps/rdgif.Po b/jpeg-8c/.deps/rdgif.Po new file mode 100644 index 00000000..09aeee1e --- /dev/null +++ b/jpeg-8c/.deps/rdgif.Po @@ -0,0 +1,114 @@ +rdgif.o: rdgif.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: diff --git a/jpeg-8c/.deps/rdjpgcom.Po b/jpeg-8c/.deps/rdjpgcom.Po new file mode 100644 index 00000000..34182b7f --- /dev/null +++ b/jpeg-8c/.deps/rdjpgcom.Po @@ -0,0 +1,110 @@ +rdjpgcom.o: rdjpgcom.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h /usr/include/locale.h \ + /usr/include/x86_64-linux-gnu/bits/locale.h /usr/include/ctype.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +/usr/include/locale.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +/usr/include/ctype.h: diff --git a/jpeg-8c/.deps/rdppm.Po b/jpeg-8c/.deps/rdppm.Po new file mode 100644 index 00000000..996eda47 --- /dev/null +++ b/jpeg-8c/.deps/rdppm.Po @@ -0,0 +1,114 @@ +rdppm.o: rdppm.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: diff --git a/jpeg-8c/.deps/rdrle.Po b/jpeg-8c/.deps/rdrle.Po new file mode 100644 index 00000000..69086d59 --- /dev/null +++ b/jpeg-8c/.deps/rdrle.Po @@ -0,0 +1,114 @@ +rdrle.o: rdrle.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: diff --git a/jpeg-8c/.deps/rdswitch.Po b/jpeg-8c/.deps/rdswitch.Po new file mode 100644 index 00000000..c3ca8b68 --- /dev/null +++ b/jpeg-8c/.deps/rdswitch.Po @@ -0,0 +1,116 @@ +rdswitch.o: rdswitch.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h /usr/include/ctype.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: + +/usr/include/ctype.h: diff --git a/jpeg-8c/.deps/rdtarga.Po b/jpeg-8c/.deps/rdtarga.Po new file mode 100644 index 00000000..9a482ba2 --- /dev/null +++ b/jpeg-8c/.deps/rdtarga.Po @@ -0,0 +1,114 @@ +rdtarga.o: rdtarga.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: diff --git a/jpeg-8c/.deps/transupp.Po b/jpeg-8c/.deps/transupp.Po new file mode 100644 index 00000000..14655fdb --- /dev/null +++ b/jpeg-8c/.deps/transupp.Po @@ -0,0 +1,116 @@ +transupp.o: transupp.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jpegint.h jerror.h transupp.h /usr/include/ctype.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jpegint.h: + +jerror.h: + +transupp.h: + +/usr/include/ctype.h: diff --git a/jpeg-8c/.deps/wrbmp.Po b/jpeg-8c/.deps/wrbmp.Po new file mode 100644 index 00000000..580cfefd --- /dev/null +++ b/jpeg-8c/.deps/wrbmp.Po @@ -0,0 +1,114 @@ +wrbmp.o: wrbmp.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: diff --git a/jpeg-8c/.deps/wrgif.Po b/jpeg-8c/.deps/wrgif.Po new file mode 100644 index 00000000..b8ef89a3 --- /dev/null +++ b/jpeg-8c/.deps/wrgif.Po @@ -0,0 +1,114 @@ +wrgif.o: wrgif.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: diff --git a/jpeg-8c/.deps/wrjpgcom.Po b/jpeg-8c/.deps/wrjpgcom.Po new file mode 100644 index 00000000..01324882 --- /dev/null +++ b/jpeg-8c/.deps/wrjpgcom.Po @@ -0,0 +1,105 @@ +wrjpgcom.o: wrjpgcom.c jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h /usr/include/ctype.h + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +/usr/include/ctype.h: diff --git a/jpeg-8c/.deps/wrppm.Po b/jpeg-8c/.deps/wrppm.Po new file mode 100644 index 00000000..481cf744 --- /dev/null +++ b/jpeg-8c/.deps/wrppm.Po @@ -0,0 +1,114 @@ +wrppm.o: wrppm.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: diff --git a/jpeg-8c/.deps/wrrle.Po b/jpeg-8c/.deps/wrrle.Po new file mode 100644 index 00000000..21e15f9f --- /dev/null +++ b/jpeg-8c/.deps/wrrle.Po @@ -0,0 +1,114 @@ +wrrle.o: wrrle.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: diff --git a/jpeg-8c/.deps/wrtarga.Po b/jpeg-8c/.deps/wrtarga.Po new file mode 100644 index 00000000..3b099d49 --- /dev/null +++ b/jpeg-8c/.deps/wrtarga.Po @@ -0,0 +1,114 @@ +wrtarga.o: wrtarga.c cdjpeg.h jinclude.h jconfig.h \ + /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h /usr/include/stdlib.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/bits/predefs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/sigset.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/alloca.h \ + /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ + /usr/include/wchar.h /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/string.h \ + /usr/include/xlocale.h /usr/include/x86_64-linux-gnu/bits/string.h \ + /usr/include/x86_64-linux-gnu/bits/string2.h jpeglib.h jmorecfg.h \ + jerror.h cderror.h + +cdjpeg.h: + +jinclude.h: + +jconfig.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/bits/predefs.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/sigset.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/sys/sysmacros.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/xlocale.h: + +/usr/include/x86_64-linux-gnu/bits/string.h: + +/usr/include/x86_64-linux-gnu/bits/string2.h: + +jpeglib.h: + +jmorecfg.h: + +jerror.h: + +cderror.h: diff --git a/jpeg-8c/.libs/cjpeg b/jpeg-8c/.libs/cjpeg new file mode 100755 index 0000000000000000000000000000000000000000..959706a4284e238a769baae79e61cd818caee9d5 GIT binary patch literal 136198 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 literal 0 HcmV?d00001 diff --git a/jpeg-8c/.libs/djpeg b/jpeg-8c/.libs/djpeg new file mode 100755 index 0000000000000000000000000000000000000000..00328b3a2fdbbd9214265bee4ce4ece0d0f40c07 GIT binary patch literal 130827 zcmeFa3wTu3)i-|5Op=)iArm+UjRa*RL4pBH5HaDRGbDit28ja7TTuu}fY?CNWCEy^ ziwVd$M5DFVs%^2_)?P(xDHV%Bz+k-;u`2b7_X(h)R>TYB`~CLb=gdifzWtu>{r=DM zf1dBa%-(D5wbx#I?X~w_=j=5nt4hl!yL4T%E|+$ZMrdZgpg_rQP0QGypb2V)npX>I z=V;kl3aFCtvFL&-XQdsgnw5G%%gc>V5;HD-;c^A>h07Jhm!=I8--*;}ohjQ(TtStU z>F;Jp&`LEeAP}raSvRTjO*7^Rypf)60_cyt>-? zW5=9VS3R<>c1iQ{k;@CmjvPB?R8#$^(L(+VFl3WcE}bPqISU`!5BuL2AM0XY2IF%YKBwa|1fK!;I4}0|OniL! z1n}Wy;ix0ZyncH?U!7dhhjamaC`;~{8wO1(ed*BFcW+;@U{+wU3Opf?h57X&#O{jI0K{}FXgMt}7w=%c5=zj6wEpHtv(Iz_vW zoPz#b&hK66nvgP1%B}<_}p^}eBCMde0vJ|!c))>I|Y8hDey($AHb*g zHTx9wzdZ$h8W;q6GXebADd_J!1^!0h`(Z|Jx?-N-X00n+4>Pn+yB}0|t0^}oEAjDO z_!WxJmR@|mJO!VHVAx+v(^jViE!HA^K=JA5#pi6``(wo!G@&QGhV}2-hMI+3@d~xM zWizMEt*&XTSym16LZ z)RgpM)D)?%t)JV}Sf!*B-E*`ymn}KuTLd9%l)$Jvx2CZX@j>?CfamR7vpG$l* zWsZ1>bzyHLPGX7Uu9J*Z$G^lk_g1$yMcBBe1wm!h)?!;q*1Te#U@sDIlGb0r%>!$( z{kUzvg8Wcj?4L-q{l}ieR_4-jDI%^dv*wAEdlUCT>$2u6_d@Pf)@98<;sX{EsWqR7 z&vxMVDgNAFDTj6Kci`E3>xw(@+;gq#umjIFtm~))&pz0fn%``fAM5fu@YY(yvJ3~F z`?qyvI`H%ltSjKa(+9DxTnFCiKjb^`&JDfLfv3M?T|oz)zK?Z<9eDan)>YxaJNLWU z4m|xR>ze1l)7P@DMGpJ`3yHMBfj`ZGU+%!uAG5C24m^D}>ss%?)1R}hb_bq5pLK;> z4te8W!Vu!Zfk2b^*Hx)3mx)3;63WV474{gMdFH>?J%;zy}D^gt{sO z{0?E7PFGOCuM(!obma?pFJVr-u7H65Mwq74l_B6K3Dab{Gyy+Gn5NQo_&5+lA0bQ= z>Dn*g-w>v0bnOxF&k55cx;g}WH({DW*CqkqPM9XpwNbz~6COagUBEXI=8$)-7V!0i z=>m5(01nLx&72jEela8ZO?b_rF!UOZrG(dZgrmu~fzaQ297D0X5ScHK2}eJSe+NQ` z+aAx^1Qw6AV_>#bAQz6d3QYVNFtv*t1_ZTj$64IjnsXP@j&M*zb|bQJw1w;g$eI|w z_>(78JVdJBI?x4Ahoc9gZ^p00aJ9|oF52VYunSTZ?eO2a5NW)Agr=26cZFjU-<cISk7}@e0Fr1c&>%cwP zzitBX;h5}q!D|-3&S0*A{&Z(pi1KJvX1w(n)DnHu!gU*{N1v{!HHU1Lj`t5wF ziQkXX^6^7AD8z^H+ezN?cn-zT&*=X0m6i`(@t?5y&g2_G^(!c`>l?y%Z7WB$O42TL7eXQ_%Sz$3M#JN{m-H&g@-DNnsqwA-R0g4~N{30^yK+16(ku6K=9VPKj zOb?QO$AK(366eN8bTQEJ^UtL%?d*Dqos0F|P#Vy>hQajP+uI91DvQ2wO*r~axaGaW z6*J2^J64Ym!o;_?i=;D<4s&byrn~!J?d@Fu!m;F$B>~uDN5s{=M=XTkBCjnEVd0z= z9{C`WaLdv3aP<9UuB&%!fsRCle_j0qi@NtK``ALrqThbh4f-&QWBY-N!}^|Z^r`R* z$D2|AFT!w^Ml?uSYLetac5boEooKLtwvdH}az31w#8&IWdsZ<2I5RT5tIUJ7GIBJDM}Xu~Ibj3FZ(t9n2wc zI{23b3r6_|w*mp32z?ItqBsDHnfNA>Z6$E|VOx{F76bJRP>*pr7UTcKcTgDrP!?@s z(NMeSu8UFhtStH=i!QW_I#~3uEV`aWqwJ!iEV@$`&1F%pU6dO{(G9YwghdnWqS-8( zCyFKxXVG6E*S5QWh2-nMqU00%+4y}D-yrc{O|s~{AwfS|;@>8IA^C(QJ}B`|+w|)t zK3CxTK1}?Xwn&ZC%yY8Joh%Zpw#X`992Fw1BwmObm-sg%eu0h8og_rsCGdSOC4Qvc z#5@$nua&Kz&!P+LqIMQdmqnQ@y2vit&7v`~=vW9vg?5p*7)58uqIXzyzFib%(Qzq8 zCyNrwU(KR-Wzp|?*6Lu<31kA z55?}t;a;`o>*Hv_-#Sx=t;Z%F3kI|`2lfLMj{bAoFEM1Wm)T#UZov^TZ^A7H_2u6I z+jyhmxGQq7m#Vtax~T7x<+K?_*?fN6aNO4!!a#f_0o}&3OyK^9FAS^BeW9z zB!rFd_eW3)me>7Wtrw6n(hnpNkUWt}26uzxs;fhDLRW9m0f(-U>qcziW#n>T+h2u{ zWVQ*ET~}eL@DJ8PEyw#tCV^3&#VE8*u)BmrV?iX>0Z{l76m+BF!%1NZHbG6+>Pi+M z)(tGp|GXIE2Gyw<{}|d2ZJWcIpRneuSj`>lM{MG+K_8C3x~*LZ8c!wB??EK=8M?A8 z+RZ_PTLiBN%MJEpPs?$=Gr0}*++d6S@Oorr^2zKa5OC^{*a&z z!<~qn4k71(iPrT5hDs<{_`@KTV}BTRMWyTQO8(a0p#m$S5v^+-DmtY3hSE$E#QxTo zKp-Sqxs1{Xab0jhoYI_aGmcyjrVS+ODzKTdjctXf6F(Xd-ETb#YmrQc&=}gTEGdt6 zaS*oMBfXnXKJV^^o^Cw^A0s|QENiMaUr@MBf=}dq_CPeYQ}`l^BpEzJhogdwTJpCZ zf)JDqiPrT)L2lbff66vT5Jx7oOx!gA+2&zbWbQ)lFSEJ21wgW`9XXiEXPjg}|JH9%VBE?6y(pk{-DKC|h;O@ z{1Neff%mt5gU)p(F9r(=)OBXhmhL0zdw3{JUI}KG0BgNZRyg>+vcR| z?f%WF^teO*%@e%A^@U7*!S&0DNK0KGhCANjE-!ku`4!f)8;^F%w*T-6+UAw;zhgby zXRB+Uw%Q$mcEfEeygD}XRtSi#(QZG@yB-dIhaN6E+T3;0)`Dm)c14&h+5NS9;ip7$ zS`L6^`RQa?LVg)!vi|gNOD9F3T7pZdkA9r+$9mnL@ZMx)W;ptJ{Cp6FV>e{R zZ~llAr1>;?M&GqmOVL48ZbS=e^=kfXo!Nzm|~(B_Kq77cSb#1NZd8aGzztmajbF=(1pRdU#dV!O3!bTDrX9?Z>^Ms3{n| zB)oEDtavufyK2wGfXq+A3g>c)T(|Z#E82Qtfr<b0tosyA1Bl37vb3X@k+9Z#*t01@o)Z?)26EwWheOC;pj^Yeo zv1OT0Ou>*$Yg?EZZ|~x>Env!kiQi~JlLGm3 z3S})%>7_+qtjsJa`eN12f+Hv`d5MVdB23D;pax)+wvQY!5x2kpE(Le9MP4eLkInCY%L7 zlLZ+k6s$u**DDyL_LAsf^cnZ`CBqN9q4(&M+rJ+C<%*n)=u`1_G}-kqs6@M3v|&Uz zwkjVBPlnhLJlz>xMbJWM+iLWt6CFsAX)av@z?mRpn&Uwl`YSA+&>*@gNCSksz5@o% z{h9m03@#>IAP#wBODp2T;hn^a;eoEq!V(pZT@viMOsy|B=B%2+rQ;#txHNH09{7Md zY07+JJX(q0DIjc?$E?guWUy_5&I_D8(Kqgu>3(St_^AXsOf|rY5&csjtpr z(agb(s=qB;N$g$OE*`YDw@XifJ487gH0ctJmM+od?y$byzq!H{S`Q1Y&_nAhbm<C4n`NIgy%8L_-~2fTW;CwXXYet|JsXNGF?YL1sP8!zWN2$m*k{v zk9(2yjorkR54m(8T2=*hWc`teAan6%E(3~6e~c%6%5C~EK8l@cIojW0ZPIDM;ufIC zqOr1DR6e*}iUQz2Xtk3SU96aSaJ^$bg{~-z9#Mya$7V=x*5CRRgrY}#wsf5OBtZ=^ z&01aI1l#uqu_<-D&G`ZqN@5Rj(uUR?<3#e``Y?cS+fr<52jaiLs)+4tT5Lh)%Ks{O zEm1!lTe}f-<RG!|;0UA@pS)d`tl-2cVnZ(~u#1GYbwbx!sM za^Y-=$CY?exuBf_6zq);Mf>n_w={^-wR;~US!hn!U-D$=>ayr$uXwCk!fw)2hpr+xU1B~d{=2xlq4kboLG9pbhkj>07DV?>x?a77wJQJI zAlIslJrE}x-4%ahKji#@bgkhVN8j>4B-R+gAUdm%ets$Dm?(?QD*W#ko}TV=JNFAw zDI~lpv3005Gis771eg++E(5G@5>` zfAcupUb_67uh)5-iIgWkZrpnEPP43NPxBjL{nOZtaNDGA%&E2#U0>;^9qVxMw_}0X z-uy56`r@tv`u~sQi?un0gJtrLw0~r{xEuW*j+?ei@xTxA@qReCzKG407d_ehQCL3= zx4iALZq#aC=f%ppRydvXZImZd}1gHh= zk&8r?_@f|~x!>5ijTYOzqJ&ecO>q6D`ES<#MQ`4kUU+)l9)`n)b<7oxzM|$$bT+1q zOWiLgNa+D!Jm8kz@+;^Aia3}7`BeY?w_Ji5RTi5J`<mkEVgZBv1%lAQD>n^bMtj ztssF5^ETjv52<~%;I)H>>i3#&#Cp`)bsXzT^keMne+H$@{oc;qZ*hB0a{B?fZ7+DO z>k(8-tXDiQ_)?x1$P=HILvXQ{WX6`}m&fWeIOuCR=&R^)e*#b8FWft}A)`Gp5Z_xV z3lD#|HH2bQO1QlQkQe(*1~Wk9sx*^nD7pt*%xT*Xc+30`b>Jp5ClB!H>&tTnK8AB} ztQ%cod02poaM7{G2PWa`>}mKqcVJjQ%2huNUzwO0o!EnhgtvF&;n0elY{22|M>ByN z8bXwTm{r@mGgy{`=Q=su%}lwQ4T#@HUE#<&l7Yu;@YO%WfXm&f47cGV&qy4^#;YWC z+KJS>GhsL>J@3CzG0|7SEdFzN&!w?Pg-Ojui z8|Wn$qwxZDK1hyTKKP13EVME~W~h7)M?Vh7z_IuW>^Dbv~*Cxg5Lg$dC;{)e_ZXfFcg#4eqSne+ZJG*diHl(&(1 zkQn`37zDhY=uY@26(fVfKbd!4P{Z9-tduuP{?-p53j9NV>tB&c#Bh9sPKhUx@d5kb z$E>9v<9|qa5)ZmVcuWzD?(nz%8Cd)N5u41B9q#6%(N~8*8QnvgF!*^3_J;7_sw5;_ zm6F(6S_clq(MK$Ic)S=W110>F(u@#hU^&ntdM2qQn1kq(Qg8HCko9nmNGI;gSTj%_ z-Oq($M|baed}5{FO4t)MJ=Ogz@Z zZ9}+9dI0jS2v7LRWAnUgUn`F_WUO3P&~Z>a5ii=YGQR|8Gs#-0=y3B#rT)!HNg;Sj z@4{Foq~IC%tHRy4oLI4MuK9+~j#r*vhWl%Tb7AS_je2Kr1TBxqD4qx5v6dH8BolYF z_{L)rFLr0F=8-eC(0X%FXnopQp_a9DQS=@yIQ&&BkU>0`%Ygrk?b7=S=E%|PNOsH7 z?#Kl#M}3j5mZO2ldk8ydkGzSPgUCM*j1(sxJpps4v{+RyA<2(&N%odjA!UdvE@8QwW(u&^#ny4m)OqnJRP_3LQ&8a zEN<;ak-QZ@_7b}`C6eEAw8G!YAA2OMpRGu@$FT|FUP+7}9`ELuj(0~UbF{F%;ZCh2if7@U zgy>P8jg_jj=vz!!b`xT15EE$#kGj72hsy4XA3zq)Xm|6Y;n*zB&Q3MRNjVtfq@07l zVt-k`LsWW`{G&VLw{syxge0L|cDy7`C2#{BZ$=^PH!T$HT>Esy$EcK~p7CN*F`+fx zoELn`Zv~R6f|hU3_qX1TvQW#nWBqGqVd2AMNaJ({Qd_&%-})9(CO&a zkFOp2=tl>o=#am4H%Qr^!!O$Uc;Cu)#$QD?)Y2{VF-_W=qL06!%xW35xI)` z!82WUGN?4dhp*q`R-+WOGhQVjCxi|LZ`07FLU;7c%)T>T!&34_7YW50<`ym-TBSL4&{o96NAsSTb z-}Wu6&EI-IR8`{NHVS=%V=VL*!TmxMzG6xASo|93ssO7a?r4d|1L2H=xpKbvw^a|; z+lp~;x$V%}k3!K;BGq72cNSKz9XeGtuJ}mF0$q=c47Gf+8g{S>R=O+@#`-7u$3NYR zzTnu7Tm}D0u@M_fiav_mj~?b0bT~Z4f)4BcW<2~k|4%wdVU_zgci>LPTHj*Hmt_Ss z`*|K>J&Ooi3h8~n$a9i?<tvE{`55!KCRnU#BXR}(5ApuP0MN{Rf}qxt`2Bd z)h@wLdKT2y)m)vb1#+uv7F0IZMTToL6iHw~ePf`qdTHg7s+#IRb5l)Y)3{WvxPCEy zwGRz}xbF?`_^Utr><}Ys0s_-MA#wL+8BmG`;<&sG4 z^))JkUldhWMKt_uNLx_Zgs-~#%7|878(D;3GA(G*mf%NTT74sb_*Jb{*UWETs4cB& zoX=k(6;=fT1!G4}tz0s4bbdjBwy<`Awy?4CI{bnOzX@B|Sfg@_D;u=N`P$H?aRL0c zX;>t{Upzr2soLVo<%??;*Ee3Lp)W(L&{)&r`ufNs4UIP7cVk+8(`XI9fTE_fh9!%& zhK9vjBl1J5&l_5;;rCbzE46C=7))@lUs88n096A*y#dxr)t1fIN*6aot_w_>RuQOO zjN#CRHZLFA92h-jX$6Qs8nl{>K8UQ1z1{D zkDsGKtpUh2v%WsCpk|qDtqIZy3eky6QM)n$3Q3j^tri$5TycG4V{=0!z~5r^s9Moj zv$!(S+*lL9kFo;w3mkPWuUta$EF`+sq+MFSWJ&Yln#S5Hn^i@{G@%rfQ3`FXZJ@CIx14e0q@D=5dlTVW+T_2AI6FX7dvMY%Q>$62n=| znP$(D+$EKZYnlR!E3XU8uL)GnpWj%sv=+bPs~(Pdp=p7@NNM|lO9SG%yr#Oj3f4g* z2t?`wOX>qKK4cd`f0tqiIZ-en10y*VWF3A_280<_zicEXPhBl+N&PypcF96C1o}k3 z1buxYnn~cK=URk@Ox_((xpeb@)UCnS#Ib4*tc7atHsjBZVa#=q? zk9l|^JttJJ_NLD`Z*BS{L$)nQn7X@=7D=A%Uoa z{$WYO+_8pmRuh+mNX^2U#z0B&%)sKB$fEjcCx6l>#+>v5a#qT%!w*aYl~q;EjW97w zmr9?aK37g5qo_{^_A#=do`RgDS&edvbvCe|$*wnf`B$!&{Vm&0YC8Nq>}a2 zJ|L?JsS8GOW9ZSxKrRPMOi-uTY}ejk#1b&Aa(V4ybW!d(>;iR{3)#Or|GG#`6FaNg zm3xlp6Xr)lO;zoJ>mmUP+$U)kJzrtEpX%+$n8fWT3iUi6DNc z9)Pp82#QheK%wvkEFEzZVokZvNkQcnc_Lj;R{`()NH`1swm(-^HZH-?jtev|saXya z<2bRdHICT6=VQehHnfWWhG}IBm(=6;-3tW~HfH$?_P~7ny8FA_`uVf)K>qTf`Je-c-OL@(qcJf7xZXEO##uu zbn#9ASxMsQr_xm67gWP?hE~h9j;t~H8f)Fj<%L6@e|&oU(ZhDzu8CA?d~g7_p~ z9VL=(ze+PoC0wY|MJjDq>C+Qsd541kso=PR4=XrhvZU*Ckxa8yTBz_v3ZALbDwWPt zlWO{KLe z-K5InD!obJ17XQ`o=P=!Ra}sY+ZW!Br4Fr5)hfpJ0P%n@%RRmtchvm-Q~1g5?$yZe z+tJ<4UqNK)yd6j>cw-PJ;Wo8Bi(|O z!PmKXo|KF9E~G)Gc&@h|X&mW;NN3}@<8Gw8k@B|{nRuwo7^&Gv3z0sE6NvSMU+?bj zKzbL_eMpzT(cSG$hP+4vNORu=J<|0^E07*Vx*Ta7$Eq8Vh7mvDO#wa9e5A_}X)qh9 z7m+2ak!B*jizxz9_;P|cV(}`F<{m^j(xXWCA>D_t(+oUa%0&csJJL)9&L1X>)a%o< zLZkttVWfpfd6_cN^y@Fz^yL|PR+`7#4qfH|KM0?W4)6l3rDse|&z$P-v&_3%yLjOE zbI;Ei!m6Yx!DrD^-Q6`rT$&zeaj$bVrKWqQ;8*M9UyaWel-~v2YbEL8h-(6}EARA9iw0Lnl!CEZ&Jwi+L~KaNkw z-@3b-pc@Tkx4KHxGjDNEN)NOpO-j$*!20V_iqi{QJSFM#T$QQmg~jRlq4Zo(NN$tT zy&-bbv=R8Ep`Y`%{ zzLA9LBA$_5`7d;L&$Ez7iEjmdIq+czp8CHR_)Wl960h`nE%X}hGdCT>DlXRF3A&@8 zyH??ta7dVlG`m1o*VLTxFI3EH6QMA<9MjvV4(MPQ6y6oO7|3^`X}du26dBI_kA0$yJ%2 zi7FTf7RvVS0R3*zhlrR;Ynq%MsFM_I?@^Q=MLAC(w9*!L1qKLw1P9v1KTw{DIbNd1 z@#J<Go!UWO4ChA{^Gaya*~2K<`s2|bojk5i$?8mJB!=y7VF8Y@dO zj>{a>Yezl)3e~!(j|lKvfPa%n!S53Cn*x46ll)53y=Bra$>#ykFT$F073tMQ{NuoH z0$z-Z1OE@;_Bs4gsH!Gsu5uPo(4P5tf7Qeb$G3Ev_l)`K}+NDtjST%;^cB z3%=UjJqvcmalM7}uZ{C>LlTs^F1dvBcdm2#Vw}tSxbEzQD(*8=V#?ApCv&0kPL{ow zazB7}3bEF%VZ%N3wMgh3>Z07wf^H+|?y>2nTY6n%jScDk1-eYE)v*)lzGu-pyb|wd4+k1^#Jqm6KQ!Eph=Wq zCO(6(*lon#vkQ4SzKQi&jIUUq*~Lpz#q_aPX>gg`$2Ic=By5$-aO^(1G+s;UACHJk|A5LgrjmJFKZ^7(j`^~HqhP^c1OMBY@{sDxeTWdR; zA^rj2Gf#ql9QX|2o%Tul{s-`0;G<-4*@onGDRa|f1mCZ<#Sq|&8FZyS-3l~nnV^q0f^M5_D z-b32Ep^B8A?Zv zW*IWt1n`h!Bu99jnm5JDzyhj0;X^vwv$7*Z{fkFgmd+oy@fuM!7w4Tz8+MCDpD2+z$uDr5Rn9OKUZp;fobV;- z>mRk~8!iY68orY2WS68bf6=BN7ZhY(YvJitX*@Ki^shG~qrZB#rp?Fd)832F0$twZ zLnwBa0O5M6nBQK{ZwZheF!p_?i~lsx?G-XutK@?lnDY#{uVyI z`&-bt+xP^|eIM2j_btqV+to;ty(!*}1of0+R`Gg%3F;It6rp+C4`8`UD(FDo%NxFZ z$$q^J!uu}mhngAsR94K^e2uWF#4pd;i&yxW#OM!*HbJ3mTK?)4|)-UPTSAz(^%gxP8sMoPWFz7J7T){E@B*e_G=5CicD`jqkunzlP1t3%2o zmofWmw48EC@O{h=lfI-4?WB0m#kYG5SbEBTDiAjkaVhF~ray#i-wW{d1U{l)7i;cY z(Hl?2-+)Q+^1j9$?hnLeuL%SR`?Y%Jcpz@tc(mxLWEN8+?KP<0vv3(}z*4lnS0Hyf z$}GOcuu9LOw}I`Sse2Y*Ne*`sSI;atG_j%Yaj0C`{UpC-k{^bl?~4bY-WdJ&dKmvqwT1X_MIK3uNKS&IDsV-7}IruPg+{+zO_exgS~G{1~mf%r~JE zw^;|%OfvU!j%)5!9L_hn7ogrdZLH^qnQP{cA%t$;j>hpa)2$PVC3XgwZ14Nbv72jGN_;JX6!`lhmf9(@wV z*_EB)8_zCz#9DKuz8y4=O{z4*w-d_tJmLz7(oElPIRbxDr2*eC&g{ora;S5COGx~L>p{VJ zgzrXL#ST@v!uLG1?s>*l0ELL<{Q+pe^NQ;nuy$u-`M!vK*eA%{*;u}V)cNbG9Lska zXY3oQ9LskTMDhjQHK3NX|6E~nct_kRg6;M>5?jdZUUV6HEZqjxE==+Go zMef%H81&H{^jzeYIu84$afQ5C)vfSt;%H5FQ!$tnzW1o7G6l{V(HSgO)IF_UGq0lUc@V98y6IWn{Zw@-|=~Bax=^Mdb9#G&QuH16* zrg*nuWc-U+4L_9>m^yr)HVWg~?(#gQkAjUzbKTn0T(|Z#*R4Ixb!$&^-P+S!w_4^p zfNzWTY}38MjBxVY_7bqjr2)XY;lXSOSQg6|%x;yDEd zeMRj1-}TFcrb~Rk;;>j?*teaEe?jyPOOJH&u_8`)J3W z{i<|@uN{7*=WPLsS@ac$=^X{P>OQ&wo&!QXVpe^OMmz@r+@V&b4?Ev88`VY{II~%j`do+Bni=*Sth7)xQJJVOq%HQd} zIjog_CuF{TuEY4>s=X-Ma4sj_3&2 zB?6A?zDnBuNCmHV`3z3+F^d0#F5i6iZ>;MALBGl6%VT+wOK$aBT)rpCf1H9Jclo|c zdB-cb!{xh%qcPD{DeCWZ`Tj)sA_f1$<(t9&U##HwT)v0NFXXxmYIbM;%jMg~p`Wby z9d-FC;XZr9E^b@y>~BHOm7+|+$6UT2v;Cb_jc#8p zm*8oNf2-T~SDMSEs{VSnZw}k9P~{ukzG~|G3Kus~jKAA=E601T($`&X-^;Yzc?!PQ z?YoELF<-$O-M)QXtg00JfZKPF_EckyzuPyDJy%cvsSZ(4qu*FTlD4xG~AsLfctu^(D!7KgVvJYp{_0!6aV=+qy}WZ%XpzP&aJ~ zel*GV5Z9jDUFQm0-IC;MB>V%{SZTXSz9*@xJ6w|lygSKvCCB22u1f{HC&~8)b#LZblYQOP<-M+-3wV7pZbOrvK$R5lE{uL(x@4S2!pC)MeXl~E9|fm)>F^3qn1dy- zet7W6Q~6e{sTlv;EZC=cpMcH^J>R;xdi$a%@Emg$K(BN)e#@~x?kYqT?o%__eYpIh zG{ZNX((3MO1eoc&o`&smHw!S}dl&pXZg;x?bA6ks>LgV+A6=pheJKoA4k6sd!18qQ z^!q`pr+9OiUxMk6d_MCHmNKJ|%$pK_FY=icp2uBJA#+Bp=J~74!Em>^UItFe&76?iBX9IRu;A(1 zK%H(zR+xKGikAfg;r=L07CQ~}QGuqTCJ3|cmS{f^Dc%wI&hWvmQ@j^4OAmOUPR(b1 zM{=Ej{2;N7Z~!bUpGXYUIR*lgRUnyG10jhy9PhSRO z)BPXN9x~mJ3490f7hyTn2MNc3PMQ>*tg>h&sQnbMgT!`2H_cJb9Vd%lAo@TM?EygN z?G!|PP&7!t6Qp$M97Nm;1gFFoc;*Z8KY*Mr-+xO!SCDgCqz@>`*;ayQ7TW>iTLdMA zrF$qT+02QQTTt%jvu#g>m=;EocgTe>Jo76|B+WdRx-%zW(!0z$*rwb32xFOKE<<6m zc?1hg&NcUfPo7zeRz{eG$d5FqW9E%AUx&8NGq<7_`R0`fV@)ni7n-TyP-ybiHbv%JkaL{r!}oY|B}yllAAxeB8GvjT znO6dTvH1yBg$~WU7)sx+nR(FhlbRU=!4A!=g{(U@b0I|7rJ1jw>?zH>43wRk>4J>A zHFGq?cv>@`0rWS`EQT7M(adS6@T_JY1oWI{F2iU%ubHE;g#2AIM?$_mni)XjF8~6` zUd@a^tQS!oBl8cSgk{s>%N)y!E~SYOl3 z(@_0&&3p&4ya8FDt2Z@s4F=;a&3qc8v0pP+K%}=db2fx{N8{5q?Oo0M0A=rKW;?q1 zzGhwkkv`DO@!w}t^3|$`5%nr2hk!JoC&3>$zM*)2T zy+A#OHM0q7{Zuo5g1&#Incs(ipKIno*weotAV|K@%=^&IBbs?Py7?vUuF<2TXb6;F zX{HZCd<~J%+i$=cYtXlv`6Wn>Y34nsejMX~PIU7o-Z$h1l$-xV&A7*W3#DBi^EQZh zz+6_qZc20%!h#d#AE&)k{O3IITa$cdQCnvTkAE)quF&{ zGYLZ6+wt9}11;yLp7%NO zX}7TO{3O^2AGxi93RB0@i21;#ADT}cC(AO@+CZLq5yu3NGtwS~O{bP{F?D4J(%PZr z)KW_A%Fe}h#5!`%Sp#~s%eDsUWSl^Y)f8o^z#2(?3T{MdUIk98UFP4hP_0ffgU~dT zIvRqk&M>{u?dpK}8}x29=Jws_^Xk>Q`3PEAjXIx$ST~;n1DClTYDqGOfYJ-z`h-7` zcNGQ&YcfR9&5h8M%WMZ@w>cC#KwH2kn_JL_6wQ4G3{@|oL}!jdPxbr7?Ul|o{H!C8 zO~0R;@>$)`q<;TYusv%OOiRCC5L^Y@(H{`l7e$ua%HZK75YOrmcDzv2AG#aW&OQ$u z1Bl<$^k-N>J39!(;QL7Xso0Iqz8r`lqbYPho!Zy3hZJM}=x6H%0CK7pY5EX-BeK*p zc@BM^#8tYuiMEcrcJ&XELR|XOV0n({MwQNf%maFu3GL_$#6A69z`0MT8pHKjuBAYn zJC1Cx()TF*q5(l*p(CiZ^Cu(^QDoSc5Ur<6bciEJe`P_f8)zsmj zonz7NJ2~w>2km-`)*G^9?ZNl3gZ5F2HteM3`~Ah0=QU-H^6s~2*E?ww@@6Yq4lCDp zp#}c!0AAK;>C?2l@eZaJ2tp`fi<4WMC*m;wJB(;Tgc}Hq__ct1xe_jygE=m2@P@a8hI_&SG`de_cZ)VK)mu!muXN( z**-i{l?zp)Sg3+7EL2Z(ag2ycKO?-EaI;?NhI<8g6j#KhV)0uC)UZ3S*y+mz9Kw!~ zcdKfs5%>qC$gUN@-|N74IPm)vo^#=Sfrr`h4=wN-u3zqI;?n1+d@NDry+ z?|cOu1TX|WgBrN9=3Sxi{t@tQC0-w=<*im|HhhghqhbE>1YWRf*Gkm=g`@6L#gq6> z2fi)AQ&-xhwQQDXpPPRWLGn~<@MvwsIf{^tV;p^M{xJkebQycB<#%B4@)gznXUf8U z-0rrY1E>B4lvcr;D0m&2I5Qt2vly;k!7*e$LuRxWBe0CVzk$qZ>_g{&h9VJhrY#Qu zpACHfRP^TbOvyhV8oCxGLL&af0$xys`?g0{Y3Kdn42j_Ord^OZP(m|Rx;KEki7_bh zx!=2D9w=~Qa*--a^wKt6EE{~;JueKh&&}80%WF(N(yPvfe5K%4PWf)il7%xMpBp7Y zKK>0Papm2wiob{AEKxkmwF-AZ4=Mc3z~@aHB*`hu6pIJ{ERwiJT&ap3^JmOF6m6s+ zGav}haz@WZ<~?LaBr9@iOi07Gz4H><+Oi6La^Lnx2$A=!8pEH1@>wZd(rpi}N)fgA zCni)a%-Foc4%(x=X*+w;mZ>o#UxuE;+7o>FS0fyJD;=~Iy=nQEBpkHYIcQh(rsZFk zaM1qHLHl5DTK=^Oi*~e@x7|Vete}O}^AAo~H0b{k2hCxNhJVVyq5+?5WrghbpzL1# z=HHZX&`x*I1_dqJiy!}%grae;+KF+v-1U8o zdxwMX;}$Ldtc0S~(U%V$H2W`lu*72%*= z?VzphP3zP-_&)2PZSPIXKM&#H`>BKWQ9%ox^RGi#H0bw0H8I(z{k{3|4@5X;M@&*`NH{s{()c8r!cNI zZi=`U{IwwBspUE1hVa+omhr_jJiHS3TffzLPV2s{P7ocMN7}FuqSO3_a-<*SfKQL?YvJFW!6Xto$i;N;RahRs$tUduQrM+ z?_5GB7iQ zBVju-dG|V44HLz@8OYn=s5RND#Xs^WuJd-QV)}M@FDc*|bgNFXpuuT*2UNkkC|K(( zNK(`F8x-81D1c~e`wUf@ISRkgNt9}N`HpI@CJI;$7CKRt=A)X{muELeK_gCxMrh-H zo`U&!USBA|=k5s0eq?Z^822ww>Qnhh%IDs%T+wknKG&}x6Q6sJg&YnV{mQ$+-sj$@ zkmI-Z$K$GBFho(;$A5+->6Z$a)epe0Brrkm#DbDkDVHss4u2LOA7!zLiP}Z_Yp9u~ zy-zm9Xh7%CX8i%VEQ0duF66X}^_?dA7jWr1Z)4&a&V<-X z_6ho113=PO7mJ@RylVDJ6l;_8DleW!w(B~LTRv_S&&`VUURD0MEE;$%*?NCD8XK3IG`8{Hz7M(4_z#Xv2nrY;o)kGOT63uWS%O`eTitbdGd zdPXGaI#)4A@jDnpEvRoslKNxWjf?d##Pe(gFRoJ#!6)c^BZ}u6x0IXp6&c#7i<5OGt@O6TIIXjl7>T;QobuZR$g-$%1Aq*#( zL>B9pKdj#>B_8NjcUcup}3e*^n>oy2o;3A{XIE7pGn-K4INg`7gNQcynx zGfBN$Dn&br#}6*89TIzG`1k-I=J(Y!D-M5eAPAvw#08R`q2m_=`+pcZj;>gtOVAD-hs%MwcIfzg zfFdeNg^t$>I1xJjB6vGP$KMq&Vh>g5_>F=-5juW{fDr|yLdPY%(GDG#FruDR=(vOv zq2psjeMB{>&~Zxd3?1(h?VlJrPL-(8aj6|EbX+RO3LTfqVCXoUDtyx{`qFmTukp#Xv$Y%$JGbB94yAt0jF#Jyf zLBb3KhQEze1%@-rGbR}rei4v!0-Y%-zqSiS#pqp;e42v z2n?6}7#N<9nk*Ci5ExFFKc*3|9T@&Cuo(yp|8X+d%fN6sR#srRgsi}D30Z;R60!or zC1eGLOUMcgmyi`0J{gTB0>dR_1%^vXD==I_R$#cKv;xB=WCez^jf&pkf&q z{u{x{3JmAS@SITwhSN9`f#DLe0>jBd28Q$368#Yv9s643~B7z;MoNM_{-F?ZEJ9Leq9&xCHIMaQ4m-7%qjh1H&a~2ZqZCbUQFymfC^g z60`%uC1?kR%b;>QFkF_}f#I@8c3`+HwFAQmidm!r!zG*u45xaWf#DKP1csBlGca7j ziNJ6PW7es_a0w>@!xszwn1w1ZT=IvDqyobweIhVimL~$kWqBenT$aOyQi0(|F$m7U z@BsqeZ3l)ku+5zvw*$i^oCpk;{1buUenFoI443*!1cpmE5g0DvL|{1Ytlim(z;FpC z0>dSo2n?r9IRnEbzeHd-w=HL2xP%jd;Sx>+hSR~pc-w*D5>5n$Oa6(#a9KYQ7%s~b zf#KXloq^#}Ux~nQ2`2)>C7cKhmvAC5T#dim3Jj+|=nM>(^ohW58Q7l)443s2f#DKP z1cuA{iNNry#CRNXn=&w57T=L%%D`|5-j!s^z;FrP3s3}xOK_td7%t%l?7;9OA$uY) zT$U#S!zG*u3{S#-=gv+9hGz)4!ww8*$R&Q%Uukd_D_;?#E z8iC=QNL0R6i^|}SDFo~Y4Cm@?1%~%g+ph`?=j{?*4HXzZL~Xw+FuYKJc3}8)0osA# z*9y=M43~8o7)}}bQW&lrLKp^y#{pP@;m4U*f#Io8i4_=r8uKbJd8tAtTB=+e~~&!?8qDd3!97lK%HYCFnj<-9v9if91mHf#Ngw@0V*(j1@bB08}Tgz z!w0Cq@H+(lZsJv7I2{9eWr-eT(MnKzBd~*XZZ~w(9OYagviJp}4ng!A0Ce6?LG->L zYQQ&LItLNgM!_lZ1)ixO8lZZ~L@>A^g24?D3~q>Ea6<%x8+<~NY=~fRV*&CWLj;2xA{g8d!Qh4n z1~)`7xFLeU4G|1(h+uF-1cMtQ7~BxS;D!hWH$*VFA%ejT5e#mKU~oeOgBv0k+z`Rw zh6n~XL@>A^g24?D3~q>Ea6<%x8zLCo5W(Pv2nIJqFt{Ot!3_}%ZirxTLj;2xA{g8d z!Qh4n1~)`7xFLeU4G|1(h+uF-1cMtQ7~BxS;D!hWH$*VFA%ejT5e#mKU~oeOgBv0k z+z`Rwh6n~XL@>A^g24?D3~q>Ea6<-z8!{N&zyoUpgBvm!+>pWGh71NbUP0MYnjwS1 z4H*n>$Y5|o27?$Y5|o27?C%j!AvvJo$rFRY4H*n>$Y5|o27?$Y5|o27?$Y5|o27?MKkyoMF!;j|SOtTB2g<}xrtobAgKtM(1%vNJmXFzFF!;v;vVy^7 znH3DqF-Zi2a{0>e%!cOq znm(CgQXWQO>SglLbbi{agr@Q#r7OEI?IA*!Nbe+=_BTT1Qi8DNJ|9O0`m}$6jr->; znf_m3p5kQ_XSrGSysozZ7%YzHpXaVRc%;A!fzK*t{$X8z#HM*TLGv(a0*ukr|9B|~ zw6m!<#7SER6i=NQ1Qud0^Xd#}8zNe{iX46qw`PcF=_+#J7CYo|N;rqI4~E%f3&z)w zF-vnSW_lwU94byPwX<(yl{NYv)zGA~5)B@+8(hN%>3+%v*Ra9c2#N-8WP^XR8*F8R zEX}^29a~GKyJ6GWH?ygA^cSiCp3@L%)byJ;2)|%yHHp^~+)Z#M!6?Cl1nUXjOfVgr z<2iU;vZlw_ZUMj?OX?myJHY1d)+>jr8 z8bGPapRi{vl|B0@duAF|SAIt6E(Dmp2v1h@jRbFGsSx%)vib$U97~WM!k)?gU8`GV zM;*e3vn*k+rLb>+hZOc&3VWJq3Hx2PFdd*2b}@xzsT6hzgb;)Q{g$ARu7P!r z0L-ykc1kyFE?8-UgZR?4N|lbnF{=IoWXr9iRsiKLLxwLK8czD4qU%5%{rSxn;m=Th zuBPK4p41~OZu(Gtmiu#k7KlflscPPRCV+Dk@CX2H6lYq4!n~?d&W&GVtaIB@co6J! z??GlMbaUP>RVJVH+7Suoj7Rd_?te$Q1M@98ESkk66{7IaACYpF4MI5Hb;% z?ecabbN&X4W*s%`VDfztCwF~_qB0)D~ggn5zqc~ zj%}8}7wO+Zb4eGvWdRjt6<84oTt9SnLKI}tJsywa>KHJd93GZaKlnA)5UiTokFcDo zv)?z*l4rlxJJq%g3zANI3wOK!@9fu={r}E>@vsIDHlN2##B0OufN6*~Ui|;2*!gNJbyiG*N zcZF?4w(mLk+JujKW~1H}wiTEZ?+@{{x8&p1(Z{ zYCPn^w{;}U#|`R8c)MU_9SL(}{<9-tvXDo@1*pS!h0O-$f9G9cd7$UJ!d9~0Dc=>w zAF+VyQyzJq`dwjBl-ftar{mDidRN#nQ@N5Zo1e}5$GMo;V`VH$vSBrF;HpB@Rn3ij5!!uZbD6z@Z@P3v7@R|?G4_)Z)N z55|q9^{%iU=DJnyVXj;C9_D(&k#G-lwU30YcZGe0RvbsdYQ?gSge7>YBVo>L$C0oE z|HC6;_Reu6EQPd>ge7Pn33DlMW!p!>veZ5jmY{tkEJ6E7m z=sXgZaNTwqzU11Xh zoH!De@Trf4&k^*ABVnnp#F4Os6Gy@lP86Zm)4_2b2}?L}BrN$Sj)Z0X#F4NpPaFwz6aAk&5?14H9|?>2KF7PlCewk; zP8qz7W>0Bnn0kFbe4D3Li zV<70PBVnHVN@9+OETSQReH{?iyTbk#d*1?QRaO0e&OI}8kDOr~Ie;S|T%H2LJa|6_ zm|+-T80Nt|6p*|O!!V2vGvhpXm;!<3qckwnN)s$AEuUp&Vnt?3S*hhS&D2OuvrN>U z=KuTMd#`iOoq-;|`ql6M`AB*1T5GSp_u6Z(wV!MD{V3oJ_Y?R`eJkvXihc*_kt<=Y z%CzV#O0I;z2I?@I(+!ttk#vp_L-~O!o={BRCIu_5V=(^`8vy(B(tor<<{lY zkwvWBdI2|9_K#7@SapTHg5~Gpj&R&@hM^VrH>coEuv~o@@9=HB3aQt5Yneeu{JY+8P~gYc=d-yyLMC&b6D4mD&m(F8-beNV$CN) z`buC0nE*2W#LsF)dpyK}@} z6ao{(Qh;LIp#ed==2uLexAtdKxR-IUl~&b6wmaq z)5qG!vA_GHWdp|mhyj=lU`l_}0Od|v&-HMbbiBiJCAMvO)uVMO?1qsjg8k+$vGUH0 z&}R$1%*tzx&{qh3v6Xjjgx(_bSytY~5&8#&KGVv(DnkE+&>O708x5V7_H{!)&zi}u zRu3E99Z7%cDCze{%Ke>5-;Q=Z5}~`$EZS+~5AC0ckVk~%8AiAC;02nDm%L`u)Rh!9 zk@WRJI)|eCkg3TqQMKn8CU=sR*KX)+;`O~U2kqPzVY>fVOdpCcy%;cs%KB6!Jp;ze z&W$SbMw3nnPuA&FidYuOvotw<@9nggS>ug4sifj4vO0o{+i4K$Pge@v_}i^nW42qv z_TGS^M(y2?&!K^~tl=Zk0Q;-9eKTs*-uYE}nU&8;>UC4#C&p=Wy%4r-Kb3%`^O?(Y z#sZiN;Ew=iFEPLj`s*J|#)oZWINdI1mi?fUGcRsRR!D`ZD3i;%x* zdiTqgln#49U?X&}0u8l_)t~I! z8*Mc&K4Yi(;` z!6`)$2n$gZW;!r$g`xclw9z4bVT+;93~4314K1Z?74@NT|NuI97vmZ7Y4RuxR;W5 zDUSH!D|i@~;gXT@F0bL+#JdpWu2sjoa5E9cySxKT%GL2M4}hZLUFM~s1pV811X+TP zcd1aA#JlM7B;JK-syq|#@;=Y3v_~chQ^@@1ik@ zcVWZ-cjH~CqNByTu+vPu3$Is9ybEvRGTaC7De*2tGN5Ap1OhK>*nc$WnV z4dPwe6dJ_4XiWt1E+1E^LA=Yo3Jv02w2poGR-$GiN2&5|b&XaExLq6_#}<6Rzt zq9opB4ob(bl)^S8-etL>)ZjCWcNvIVM2UAvG1mijin$)JQ_Qtbyi1C?_KA1-4Qh$R zyOHRtNi~r;$8HU2VuO6e)1rE0zp4{5XQUcClA7Smm0!K!e)1rUchOHCgz+x=$%8Q7=s}jf;4fV!-^*;2AC#yei&> zou#OVccCLu`I2ifwgX!PkHouh^p;$0RgG>CUOL!m*u%VvcJ z@h&6Yrv)JuvYub5M}PyQpUm zOuUPF_Q1rusAmsMyo-AFU>0o$^SU6Lco!A=qT^kty`g;L z2po(_8m6vW*a1SF26%|gK2Q{icUcxNvp;ka4FTmefFSWM{KJ0y792iP<6ZVE`sYZG z#Jg}+7Pd&@U2X<-n9b>i%d|*3M~I>PKovhwOkV}U#oIBMey5oDECZKx5hjj}s-*A( zWex_@Fq^M6aLM;~*-I5W<>VSrv$L+SOu3EiR-6=;%R|k{YWi|shjhlfobX<}3l2r! zi+6c1-sNA6cd5sb!F%y8|E72sMn)jM5uXz8@$Z7;d+F?*nD6&tTihDI3?lOsDQXcgL zLasi<#_1PMH0?ZH%Ph+|5myAbra>-;*Npa*GJqK_iy2}&y0{~26;xPdvq02lQ_aEW|LP3zI+3aS^%724L^e=ecrY`+&Agk zJ|C9!d6uLfOt@)2G9^@@U*H5h64&PnNSwkFzDVU-qg3=pqb)ZdL&q0^3VrZz#!M3VtyGs0!U^WF^BU0#%V4>#3xApkq|vMlX;dw%J_>Z4)NHRq+trm7qr85>;n_7ECCjI;~g0ZJ&<|>IrL*dM2I;pU@28MF11YpKbU$aPMaS zWSuack%xQ7+d-Q|?#WVGPk#64Rlee00Y&mNJzkoCnfWmhvS6Ea?>h1=pC8*a=_7h(mEVvmvqVIcQ1j zd}}&e&R-)dc););K%;-8cCT43h~4Vd}<2vg9+2!l0Sy@78(Z_`Qk7;d?YP0WC@ zm!j?3>z}7z-27mB$SU}bN&Y!X8i@alfy{W`&?g5p zJqS(ti%HOoig*eF910ND5WVo86TR@Bn|k3*FX(;Yt%l#il*?@T$52I|oBGTHdt4Ia zS0Ff~+fOlp&`?5{k9b2qFLL2cCE<5?L5*2!`a?tdo&Q!0#k}x72g%V3Zu>Df;=gvm z9lH#A*YEnrE+-gy*Z;#rQ{MHD@5f2Qlg{yWGemSNvDI<1ZFDLpWVh1=I>`Q@LS6SQ z^sqD7pxN#r59o;o&2isBbc>T?(1iOi24LqTgN}C}$^tsXp!sebJ6~t0L1(#qlf@Zk z&?1-D+0Jl-E_J;@Kt~v~+C7dHB@DXK-2oLkqwLR8#iQ4{F1+3uWAiv8hIejm#T@F4 zGcD?Hzf74Y8noNZMi)4f>}J)#t?m@&&9`fS^8D82EB;P_y-MM`YG}7D?z~Lk)i$5##}lx&b=(8Ejd1Sl*NlS>{K`F5 z;$1_T4`}UJ9#0&cd$e*~?}zN)gSxl*ihmn2=wI2*q@}Q3{m%zLD(yp2pAf1K%S!te z`ZY_tAxpLGEbWFGvC2oI8?58NWDNh6gf{%dq#~AUHBHywgZhE-zY^&YzZPPA8UMML z;o}s#%jfWd5#DYDdYp3u{3EU42Y~x2S4ltK{sbE8(N)s3)hjS?6_2ixKFGcbe7N!S z=ql-h4VvxIRnkv1XpTo$NzXB8!lSFCpJdSS9$h7Uh(Yr`x=Q*`gU<5kD(S-vTI8ih zet2}1^bsbt+M}zaCk(pMqpPHkve|=h6_2ixKF0o;LN|JJmGp6@MI9bpC4HhnyFI!} z`XqacYT#Cnu9BW_uLDX~@p}E>g-2IOpJM+4Wz$tWx=Q*C`-s9Xw!L0Ic;OvnE0>x_ zO+IdWbd~fngYUOJx=Q5H6OXQvUT)HFw>`Q_`f~NC438;5u9AK?Rgy(lNk5>qV`b4*((lpAakJ$eDlz0O{_(PTs0^x6M&^)a8>40*OCgtiNkQYEz zK_Dwxf(`;9$P#oA2m=rBI~cmWExJ4efy9?1C(~4U*&5#}cn}0K8WaYB9E5CHDM27v z9y&C>OLu5m)$3*K@8g$hY+zOyTsQt9jpbz3 z!KUI@>X!nCWz8e!$IQEdS^MC7@oO~an5<{u#qn!3Ha=@G#EgGNb56<{fOGNq4I0bO zx{Wp5#D*gXBj@9l=@bU6=vOl*(!dU#)`6TfWgOa*Vv-0S1`QB@6g!N ztn)BB#lNJn&G>kReF}P3fC;LBc2G=oGzn?<2H^#pZW7*y} zX>d2kj-Wu)<87m=ZjJSWIdN(+zk{Juv%UME?D&^rBUNgSXC6J#sR{2CY&+t2#}+HC zkN4Wh{H@qcs^m!?e^fXA9g}*V_akUM{$Ok}nAMohP=ojru~Sequd6+-@Z(P^cD~T> z714#BG3gkyd;JcE*Y|fYsK$OT!=g9FhdNZ8m&V4O>^!f;w>P6p1} zsnZekp)t;>3eEA%?_jJ}Xu|t28#mdxM4{uoQ)$*y9j%FcZv_2ln)79qI?H>F%(I=J zDYVEdVMX&Dt>dL$1*YKm0+YAeyPdtY*r8(ZI~d+!>Z#12YvBhzTGCH~KxhEokExnp z23?r?I~d*36r|sdzmFaY0!-x|3WYRQ-ij8 z-=I}KV{?E&5Qujp{p4pRwcC4<4Sd$LXsh=Nw&*#NdY-oji^ur$3RPb8NA~Uu2EV}e z_)}EzSCo2`SN#T+#9uY|hi>HsjZ-bme8sDfnv!ztZ-uXS;r9aClv>-@)*nPayrT z_LZo{!E>-9Sr-WpCfSuvfCmDDQAH_&+bowj!oC$&K)9V;vII~aVw zm75UH1cB&BO%B=Ki|o-!F}}{g-@))2u&RnrHu%Lc&*$hi&6Iy*%v;Cy&4|rV{I|!v zQ<*+Hrl`jL+NV%}GX&o}s^F|U@6zrf&! zV;=vMKVBT8iSc(Zyl=AW7n}0_5c3+aW{xk7aoXaeC*B<#Das7~PR#oR>tAN@zs9_^ z?CYU*LHBA)0ul$$zoqtzrGuCjG;Xx1RbwEyhWd zK_K2o*xyN`ua7(4af^mBns++;;$yKYg+H9;ae9bf6+1)WPo{Zl zMRRqmS>ey6d0(UMJ|62*_{(V?pW%pqBDO=}ucvvZGX0aW4=MZ)Y2H+hE7!!XR`||z z?_KKh+Sq3l9t{GypGLh9+U3>hmv1!P{rH1((j53v)?U^8uq(XDNb7|Ny zM@M}mJU;socbvT{b-edg%9iHnybJ=N3~>s>kwXc`AdusMND#w=V?j^w)1j1#;&@#9p+Qft*HrEo0B0(U3RAesHH2EqpgF73943|%u zWDkN}XSn>Ci)^ldhuGBK&@*(Y+)fNr(+E32sC)orh^-<$$R|M{O#w6eLotgO41ACv z5c*SwdlNoWgFp@_`nO4s1c7i>7Pd%&Kpp@Uu^1E`-V#aYj53rTsNyBX^av0x-j2b< z_2V%6YOr!i7h&RDph^lqP$nPN9%kPLb}sq;E<49PEhpE2nw@opWe#OMDEK3alfu&f zH7Bd-%lUPrGYDi7#*z0PJ$Ww(w}e=!K80~7FjK_LH15XiSNgqcTAJ^*EAxEJBG z|3NH@^ZVuTSI4t1$D*p=)IS2`F`Eto8H7av4{7wHCps-V>oV~4o6kPM5k}UXSRC|Q z#DN|`AX$5`wCPvM;avxTFpr*R_^>_dWnDvT795h*2#U0Kk=FkcxC6`Yw_+_gR3J#d z8g6tc(=Md+tL0jOHGLuhtWINNvTi1Jn#RWCvWn=cvrz_4Rq=U3wLR$>Dbb$H#Phax0ULaP$!5=TFWSxQ{>?yh>MOj}bHdSMbvKom^)3q(ldV|<>ownR^<`SK8 z4r+7kkpO4C0Wia5^~0ZL+88`U(uD1RjuIJTbA}$FVl>9sFM(@BIl0EFz1)aRA)I)g z@F{9i)d3{q6^{-anP9U=7)_#2=S>XB5?k(64ooVt_;1BblrkRMAAMoFgw?+Wnhu0m z!hV`P3#bZ&SjuKy2vlF^mQy~aj(H@3QkJvZze!ZZlvL~n`aDq;wV}}B*%Am*$)YYL z+R?BcKS)CL-3xSFsS!*rxN(VlioKFIxjN9~Ec>A0D4$$}OqTT$ve~Z&O*o59*gZ#@ za2A{J5K+~Hvsv%ZxzdC-Hi4@|1khS#-I4PZ}JR$UWdGs7Xo;RKqY|H z#Q;_Vh%H1U$oEVo2S*|1141zhU^D1XMd;s((0>)7KM|q76QMI~1U+i!OJS38Q91sx zk`spYN}Lf%%DRO-A)>ipiR`4y4Ws4fsi zL1TN-w!euyQ0L!n)F!fP#zw#r3my`PHI+*v=Lx+_MUP!)%|j?L`QF&{BLVl;TsN6#JDF-Q>RhGps~O@r6(d z4Js+V7)qf)Yub5~Xr*nhHQE?Gtq5h{4W)&kUx1N!x>CSOHNNI70ojc}aDqzo!$tME1 z5b2Xg0k{#sTm}VAo`sKRf#nuWDPq~G_1hDs^^pbytv}5$UZI&(>)RrkzbctS)y3TL zR^bJP=lfy4{A&#DXw9D%X@2hWMo*ceF@?Z7sVk1LzcTbOppOpeh3^>pOhZE#6+U7r zE056LG_>}BM*VMB`d9O4zLlStT4eDbhaxkkS@Z4p4?rh;&{qDCZ=6R0F9wz&?Q>w) zPV_U9Fius7@S4FB2!aSUJ(hiGMwToR=skcoX=7cTLI8^dgF2oq$5MXWXhh zqq-c#!ZO2^uOu|VcItT){s>UvZj-zyNVal6WN7oCxHTcY@MS~4FrWqYkGZHundU02 zF2ENv(kY}Ue*STkCIrWdEinz5BSp(GMV#$na67-SZ+K7@s<38y&+w!k>D4%5Qs zIYs2N{+tQM|4KNG37;`>Ghcx$I>ZcdGrOQ)6=D{~&8QHwFm6VLn1yjOD#R>|n^7TV zVcd)gF$?2nRESv^H={z#!nhd~Viv~Ds1URC;U+RhhnR(NGb+R^jGIv*W{8_P2>D~9 zb%+__X6{$04lxVkW>kn-7&oIr%)+=C6=D{Nn^7TV=>>KR^yG{-A!dl1`2orfLd+01 z^Nhkxh*|mqdza!jA!d=d85Lp{iJMU&W|6oV6=D{Nn^7TVk+>NZVwPTMZkJ4m8RBMM zQ1wfQS-J@^OTU{cQ6XmO2efu{h*|nQS~)tzEE+d+2{L53G>gn@@xgZWzYGAWv=2q4 z2P&#>WijX~z20Vy3^&ce*(LMg;Fut0(Ess|1^ulTQ(94YhC2|SCRpZtMQ9*F2g~sK zBy$8luET#y)*x8sCQve5t{qIU%-xDW#%u)3yohg42g?wQ;n-aV%bW&`H-=Vb5ums6 zpOmYEWw=y0A;*qynt@r<)4?(XS%MChS*)-Vba`8Jc?g!toQ|AKQ{`oA{4~LXU>O^f zYy`_(2aS6v!7^S-u#A@yEaRmF%XlflGG0osjF%EDPqZSjI~Umhn=8Wjq}$ zLlyA`x_7V)JIw^kG(b!fEOR%w5l)EDekNGP&wz?`u*_|$C`(^0{fIrqo0pVe880PR z#?!$vEJ6p%Ohldm2$oq4ihlryJC^?(K->S#V6gbl4uK$kD_kng|1qY8bj#V{LTS&Q z1SaHrp_Td6iz)smFi+Y371_vVIm0lo#9v&Yxqf#Axm2)>e4Z zg4DPK%cRF~h}YEF$q1KM0mDECZfe>@^j_4A_PHilW+Y}cL_oNy!7{E1meKu~aC-&I z#3fjUWxFO=<`K$_kYy7r^Rhx+*96Px)NI!T%e<>nb6gWFqf--ZYOsuJf@LmJ%#+;I zU>Ubpu#9?_1Hm%t#3|C2b zZOk>nGFrz=T@x&$^H#g5!7^^2V42^sSrRNm18_~Sj4r@(Q-fvP)L&6D)HG zipn|wYmaBCU-ZdvKLy*&+61k{vu*vGL41X75dWNfPb_}7-5*1UHrE5G=6WF2To2eO z<{AXcXmdSar7^++oETe^72_-=vj~bcRxF%SJLqTlxTGs^2Xy)~<36|05 zM)jOEf@L(?>Y88~4iE^IaZRv{PVIJ6gJoP3ETdD;b4{=eQBHlX36|0L1-6>y5iCRX zD6cZXG8+G|?Ow`eguyayuV5LsSFnuRD_F*TK7ssywL4Y$`)$_*%johEk>4v=#^v=p zf@O3%BJ_I&%eW?3MyDfU-vrCNgKR2d-vrAHQTQR-HNi3y75=jAnqV1?UmSCL1MJoS&G1mmkX#CNbYl3AoemLg# z3YKwAu#7J64>8vS%W&Fau#9VhWi8vkp|HNi4m;4oOmHNi3(-{rU_SVotB zf#aHB8J+)P$2Gw+I{m|rYl3Asi85Hm?G-HJ_6nA9uYu=Bf@R!Z!7{E1mNEVBxF%SJ z>p=#~xV?g9ToWu)t@L@&aZRv{&i|a_nqV1?A9mbc!7{E1mRYOv|JoT?i^oYAkRxh7bqMd5!)b4{>JkHUARyCztMKUagXARYT#_17nO5(~Yb$t4-x zMy+ujD{~HD{%7zEmkVCC5@u&9>hV@49f``9T#GTDbO?SNVr6ln$6y(b-mVFjVZa8b z-_&3k*96NjT9!*16D-4ZEvH`-EK{e@glmFj+7&w9{VLbAX^zgzU>VAgNntp0DB&0^ z^BR!Bp8+odSRANfunCr75Y1o{EHjj_36?p9unCr#O4tO;EFf%xWy%SgV42ein_!tn z!X{Xzov`_Zp!Wklu{wTF?6UxJTCDgtG^B!Mz5<$-n~;(_uD5jG6}-wi$>vNy z)SRrQFXz=rAAn$)e%O}y{6ieepJ;O@QHYI3%x}d;!tq~&Riyb_keKejja5p9zX5RE zcR_dk%QK)8zs$!@${!2ud;ah7ndxVP-rpYv*z%YrrgYr%h#e>UJD{#cYb)PDf`sbPKxYCqZM zA3qQG@51_Zgx>&4!tX@tNdJ25utxc5C}*_)Aj%)(=VG5V*1sP-Nkcpp5q) z2W5hPKIEC`{}|<*>bIblN&YOrll>}qcCODqt;q8apcVQ4=}0Z`CqddN{v#-7s(%*p zPV;M_x9R?u@HxXTfU;-${ZPUze;B%9w*Pa;ImbT^pL6}~NGY%a1|ELzX`U zVtmi?9|ZP&%P)Z%9<=-lWcY#QzY6S!mcIqP@gvL6?T1TP%byJS9=7}hDt`nRSbl8z z-4N?1$c~lMqlQ1q*o&%N8PE&m{Dc+K*^fogwa`F{ZR zTj&MqdEN56pw{16J|ha>u>A8O;1SCo0(*KB0)pi&%fBAYeB1IriDv#DJ8HD(52y&7 zf3*DLAjF>_5?cFb6peA`FP8s%u)JgW*C6{}(GO_EyL6=EMpYu+e+oHYj{84H>aXHH zqy1iq`EWN49pk{!H}5Zr5K1kuGrkr@?ul z>(52CA9VdR2yv0?{{W?2?D`pCxy1E90+vf%pX;#?x&Ft&`C-?821Q@y`oBeCm%IM` zknjIK2{RA<+V&pCsB$bP7?Y3TPJ5sVudQ=*KWz>FAWN0UaGTB8|a? z)A`^TTSfLu)n8K-nY5E<79j=hgADddFd8lPr4;+i)j(C_FJm46!QTu^qtG_xNj(hN1X#>OI7z!vD!Q7gruE{m1ZpbwVQPf{0QWOn96a`pQ z>_!ZO_DgocXh80-a-mk6Kk%c?^Cil2Z@rl3OO)w@r@;zo!8e<{57P?Yn2#ZJ(!1=m zH}Nqc8{^c}erOnPm?sVbF!OX6=5PRQ1SSC3OJE9spAz8kGkPUv*{_>&X?Z*!G1iy& zxS{j6Q%Kv4`TEa>c5_IZRyC^#in1(@DGvwqF??DC`S`SmHEpfoVI41rbxb=uLbuQ& zQ}?vZ5qeHY&-;j>Pck&fG870QUp<8h~m0 zXK8`h*vCTQr`>Ak97T@=4WOdn?9=Xvq@IAl0o@!)eK3-m*E==uwZepPh8R>orIIn!p!zA5j9~`VPpM=KH>ken&KO}( z{gg^Z!l3#om5fpLgOEQqTHkYLjIke4sJ`dU2;PTK_uLu5`w;4$J7bc%n2wFsPpM>t z??b42?u=gd+!<5UQxw5Hcg76+CDf%3dig#?#sd2?=!<^^sh(2FSZeQ6xOqw?qs-v@ z^;0St%M6Z#+sClL%qTawc}gWCd>=yHb7%Cr=gz3MUsLtpXP#2YF!$UUcT*+mo;%}! z){egC&bUV_N8fX2MBazMwJYrUAjHk2(Xd_pKMsIY+J~aPBUJ1#TnCH1Eb?Z!Sp?Ss zRKMjBSHXC}Y1dakKRzv1a1ofY&wwlJjAcKBh2YM#>>`-&PB)uV+0N{2_jr6IvcCX_ z+Ii5*{v@WyojdL9FCqU<{sCsv2W=Z0RGO$fMl`} z1bT?&+keKE%0Acjk45mRHr)W|c+lfFV8^?1V&Dy27%y?f{< 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

  • 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 Vohej0kSXyK@bvV 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 z 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

    $x+^IwPtuS zIaW0}4#Nc=bm18)nAiVXc(0nl9cuMZ-UD`AnzP7$&i5a(6u92ga9y)z5WAGAP~q## z5mr*5=AU=P9auU)UJVCIasGnj)D9d2gix2V7Qu8+t>|wNpXKp)e2q>@)*y3twDoQh zV698d_xOSeBS-cBq3&J4;;OEO|GAI^12U*lsm3}gQBYLSsF0wU2}77khJ+YmVvPy` z5>Nso3ny=IV6XJ$oRfEqlsLG z6u*5O>?E1m&qKix{>@s(zx!V&m^a@UN>KMxN&U!OgaBtPAbK%JV1?9Yl|Pi}b6JCu zlbE42JoAS8uFuG+S1;5_OESwMa}nP#=Z90Zn|CQv_(+zTUT2l*ba(n&|5vl@SWGp+ zK6qq`#l)!U2P&z#b@dX&K^9M==hkHV!MPbk^eE>P(Wgs=t3FA1TLQQlsu@ifu6aF&Mc@%*~SaY0fvYF=0a`ML2z%-{? z?~0!0G?JJZlpp7mO)Ue{`6AVWr}GEaWrs-{(%8Kg6D;$@h}v{Hw`otq`67v7;k<#f zmcDG5M8s=;^zE~RKWls9P2;#t{LO)cwkKYZoZXYaIIw<2CcfeM#4FurNwA#znL$bY zBCtocy=@7^2i($Xv`xTG3l-610k==use2ABL)NFbI0aV0*ScS45-0k+<*51Afun~v zNl)Am-l=krtf+YcyU>7%^f?D4|G#$J3JV`H^7*dEt#E#ZBPHNV6*l5X=*O*ylx#xn z-y<#-L%JK>((Zh12FFSr7*H5wB5r%4cps6KlTb1OjcChW75%^fd~&r&gM5BZc`b4z z*;mIK2L|v0qWZ#Zcs`y3114VPT$3rTjB|}!4h$G0U)k3W3~*lSyv}*Od@w(a%gy$04|<7 z(NC>SR2`5t$ik{OWI=-WTKJw5)7x?kpclC`PG)A z?wnl>59&6F^U4RUSAaQcvBDl+toW40icHU>UMa7d-oHl7)v6loU3-2u8BCAKNHRa`Ll1sMyfe5qRebq> z5r$XuzE+g%4)9Ih{LEl}8upO{t5kxPkZs*5B=Q74&d>T1tC=XcbQDW-1KYQKefr^k zw1P9RL$di3r{5ZvrIExPEX-{F$UKvCMDsafuS5oPQyCKkjv8Q#a=4t(jgm_vXl;iF7eZ^bGs;xP9DB7C4 z%xlIXYi4&&Ps6)x4oJjSw8x=(;;D3^Ge>933U&$=W_Euretq-Klqe4bZc~8iv3~gP z{HIXYeFv!^eigxlMSX8B>%*2kEXm$3ZRHByD;um_!QV=|xPwKRD;k}Mljdx_Mq_%0 z)%jMpnbDe=)BFm9t`ALx!Eqn?y&TvxR_c)z%G!gHUvZ(li_ja@AL+oL8^2w+%KgRW zPnbjT@yg#sRj18)Rm&dZ<9K00?-xSdK}V)H z$mo@Ge1et9E6Sa%`C5L~0R}7%D}K=QVBCLT`}AP$JFNa^`X@*1*cNQg7Pnc(VOF(p zns4S9ku7dnMUVitXi3PLG0a_?`G9J}(;Nz6cICXi@-Jb+c0|>09`qR}7Fum8^M|B-_@#NIe3*`N0~m8_AaOw2Aho6FaOjkOs^-J!1*|(DB zLP=2L;3G=lcw-R>6rpW?(o$&tu;t4YXS;)W>{9$dDGA=Jq)@FW-UDZRv`Bo;UnJwo zS4EPLf$CJgqf?%mBHw~w5qf7Dr|sZhe5Q_58E7wea7?=+?Lu<8gC?!BP3U8QTP;NL z(qwsRmkQ5K^q})=`CcDel%2 ze=fUZZTXCE^C4|~s*p#cmkW*6LZjcHv8}n+Vp}zfZVF)|rG(%t@I$cFOXCG5hsh|? z6)eoA*qilYSH_9D^^(>krQ?kW0k&211b_4LB9pD9hURev)kKOnc(*WI&J$iYk6>@> z`QN|VWXk$b@V9&z=*|!N@5^0rZdNFtFYV=e1Mf7P+&vpqN-p`bk!x~Yu5HzHLg?E$ zyBiKlgV9ir$$&w%n#Q+S`@OBBcFhwNjt=

    _N|Od;gfQKFZp2(5~=B6tXiA7r^`> zU|%KMR^3NkkU+kA&Q~@LGok)Yyu6gsy6SjyKb2|;-SVXSFbx=1=ZE(n{FhGOav$&f zjgs+Bdy6!W{B(9~=FS!Ti;}*7NK{znG}}7a(1IFq2bcT2fsdT@e6&)0*WAWFbo||t zc;&m@=_E4rN!K^Mn%4bWUBx1AvMCAO?q3=bFCc8G$p%TRP8DymWzUE*!)KB6gIflza|IX|#XsiMSZ;>jwD>3lp> zP45;d^GHA=TBcGISDK<5RBlms^Id`MsF}l@knlXIswJ!>y8l6t=q`GeKh=kRwsiF( zzH*FBB?iQ{?ynFb3G9M9S#UdpO;Q0FSE*bMiO!a_*W~He+@zM!jNmw=+@msjQ}J@V zlAE`b5o(f_$Y=cL%X>*h-m+z>)ibTGJ+!V%IwIu=UJe&8PMzopx-&UMc4jbj54ZN2 z!3@UQCxVvGu%3^|z%9X@lArZ_e%5PQUwU}?`|z9kdJ@`8AcDS{K{^E#Qc`Cr1yI8R`;C~bG^v1bzMZg=&3(MpdpVh<%U=o13OVKUZ>A|TZWsPCK6?*Gu_tR!)|WX?t#CP; zS2!&0vTe3iJ4sg98h5)Z@Qy3c$q2w1%s#B)thviN+-2<)*CE9mPjSvbwlnZT&QprL zD<5YnVza?WYkuH8>TFvT02|CHrD#{6BtxatnIX z;~Ydh%eL?PT9^IZG7T+kLvf}Rmc1?mBgBkpQ8tt@MnZlW&>(JU`GLbSp&Pb+sKfl6 zkCvl_X_}7={-e%Tq_I3T*&P7CC@B5C=o!JpZEH9T1PPbjkUi3g5S9tc80TVM zD$}}N<0G%MozLR`A-%vI)eErBe?w~BW&7M^ac#<|3KcM~B*U?V1Go+cXXgfrGJ~@n zfuf1Q*)E!?1cCxZ*)&ae2`VTewUbnM2G3eD61DzsSXEt~y8j`*5ha6fpz!W;zTn)( zZ|=YlDEM1Zg=|O6TyaBd9xe15-)VGMb$u{BIPT4s*VqtuuHPm4$F{{1>f*CTy|yh= z&7m#^#v#UwqdnHRuWeg?XmNx-wl=?iy36)RT;n1qobr!CJ;yb|Z>u+FZ$n7e9Ivdr z_nK=5&0jDcD~NyW$QbwnJ@gA*;^@|Ej<6R#i=7`FY;d|M@KWH;HVKgyJp5*WgGRbJ zi2dv2hWE0*d^DMg7=Ay}8|V;s>hN36!}|kwX6B**T!B^DkCPcmVOqcWeRK0+v-#`h zuQD5+3%s1Q=kQw*e{xWBF3k#>g~ zmhNaX)LY;ioa^}DJfGq9w>0c&-=p^x7f34}mrhTJ^-3L@okP)>rUT^yy!8txqoWwK&D)c$F7Bqit z!B^fEMxLw0805ib@$p+iD;$?A4awdPMrCgygHaliFfAFBAn{-7MD(+9rd!H&jUO&D zl2L>d)rzK|arKM`pA0sO)Om1b9DE9gb!G>nA9su9KNbJ8>y0ISnx}bLYLUr*j#S4@ zTGPRw8IE>%a71@-2im0yj)R!jx4O0<^9P?3Ib}V9vlqfgxR)h)gYz<7!4lH@Q#*q< z#|7snx`K}6VB@%)Pi(FK6w=B#&acN)c8IN#?8EF~0r*mJvA4Z9+8N-(xgk+ZU8s^H zqOW?KIj^t0x-fX5E5O?FhjP9}m#Byy`K}NiSC=!VcjW~LsfBK^9JA2!HSLR&d5|~! z9+9aIi_99^THYm?ev;F^{C%XAttF0}rdkZ!x2d6ev+gSf0?p6 zJ!Mb10?)bvEQ#j4ZfpHRxE8(C!qXbZ*xHaJq$B<+BK>yrz-EZUBa()S7Js=bM)0F%UI*&AqOi zcbOQ>Tz2*%NUVg!^N=d6&cU&ZnkVr%o=34E&D$M0`&S$^C{k?vrxX6Va-Lhhk@C9D zB-H&WMHj~myyXh~V4O4XiZk$qGw@A*`rFR*XE?NbYHQpxQUO=s!)@=yO>G^whLATT zggwF7T=_5;6N;?U@<=lOb|NC355#$cgP-rUUMTaf5IS5EtMzDB!@bGZ{!cwW?; zO)XzV!}A>}#-Jag&>Y^JXB%FUaho@%ui-H4agWL8I!S&j`<Yfx|VBo#?f!a(=E56hPDRP43NvbXWv&XA+T<+t*aC> z8T`dYdIY1EC$Ir4y|_uT1ErBp<_@0X4K8F7=!Rq&dalWOUdEGKW&Wv+vG3#E>&dvN zEwI~_zQ>gwGVejrvUx&!RESHa;U zqS?hkdRr2cojJR0>r1JUGiQ&jRSZ^ueV-8IO5f&6-#wgI=v+TvrT^5{DgzuL_{E_F z_s1r9y&RhD%=v8j)W8?%Z@OYr-JMUOMQsdfH!SnOvn*I941-nO(m@URVPJgUvRoJM zhC~?Coj}g8{UCm$ZS75jbpL}~)F&Fz?F0?VDwt(hy(TM!HI~UKTr$z0o}AoWE64KU z2OM1EO2p9%F?k$ncwa=w)B1Cn62q9bx!Yyte@bWyy&xFVxy$kZQJs1roWGKrauWdiIC2G^M`z8(HrPa-_;s-vn1;9*zSJ@)xmMk zDCJSCG@ZoeSq2+25roQbjdS4fS~;?@O*$BF9tS=k?nQJTJG$QE`1%(0{tBO-X>B#d zlLRW)xLe!Wq%P8DB%n>EaoXgi<~4&_XwVw5{DcFp(Y zkiq7zCd5=0%G4N~FVcU*+rW0jm3cQiiwP`QzTfbK*IdnUO&pA_BHHbqTb~qiyo_Qt zG~6LmA{))ra-#@{ZT(K#6&ku|+5@tq?2zumpcFT6d)LZ&t?ZdV&sgY>+uj|`4hc3y zvrGDJLFsAza}!l6H18=4vf+FmFJPtc#)qy~S?085gZsM-O#=x-os#QE3-19w4&`5i?6gj=sGGIOcNtKP=V_0(Y|m82QZp8{gc=@JGk>-% z&y(^?Zy+(X>wP9Xyurj&m1J;94L_Hrj;F7TaMH6XFi6O5LRH=NFN0BeyQ1WpkFXA}y+)F%PQ1 zCG&F*)rY-gYa)$gmqKjo?qO)f3aDgs8Ib0QG)eoaRMDyOD-68ZTI}e{(-)1_rfwxn z`RI41cFHX%yMQvQOXKpiUqZ!2;l6`=qrZ76MsT`=Mzw-^wU`SXJu}GB>cmUc@`G-- z`0J}qfJ8Tef<5@SBGui#9Wm5AR)@oDy+@Vrwce#lbRy~`G_^1>r7vN++e4()Y^z2K zB81W{deyByR?bANNLppq^G4-m)ubrv%UP{16C!q(S{g=Ba|I3m&xFgTcAUrVCAcT%oBGDbM$^|d*o%==g??-#Gg8``2(}<5v1H} zEl+hj*PMW>D<_dx%5>oIUO3f6K4-dGDpSvEc1kswRmj2R56v6z}4KiQq9}?BVKehD~Y7z zO3`t3JHQjR@6zv!RO4Y@Fi*PB!%1&yuG_4OqU{kT_C>(kgiXzQM~GkK3@8ELDuJxK zOYb18k@0H4&H3wlaZ*v#y#z-o>To|Xy2N7$x56TQr!eSnv}p7MOp-}Wl1k5)LKzi< zjg1OftOa$8Hxj1bIZsUhMU+zWq5141R8zn*ea=1%yDM0VR`<#p!7Rr0O6@SvVhckP z%Vk#WII(3Z?GytkfnDv6xYN07cf{)fPqsS}r>KBr70`NZTDxPMByk5HlY+Xo^66)1 z^AR&0CRa$ets4z+q4RUqa%Ns@+@=4LypPGhC*+?qXD1fiwsySI61?)C^VN!D-OY_D zEKJVo5m!?@&E`;=E9cW?Z@OE)w5|Fp*@DyJ0(o)4X^DZn#Nf1XfxL0S(E%%yuz|ez z;I!mG9^KRt4_*})OmYQhCc6SJyVBnZbhujM`lRIa-P=0j@>_GaxqY+$b~u0m8IiMF`5o3Ts$w@Gc|2^n%myr|7M2*DJ8?xPH%=;Fyg9Tv;iM;UbY1#%} zwkGZ+5pRBXGFp>GFzGx*&~xJH0~r*WW?Qc&8=xeaw25k|T;6C*^IFqeGhW0+mGOkK z?=F^n<7TvaFE_26J+*cGA0P%L^eJvoSU=Ky+bk@=`qMqU4$d*dw)^=8!Ye#*_Zo-F zxLU_6l?mp+k~^5C$n`R@Cg zIg#TyeOL~nQX-YwX9ERqqeyO@v;8vL`bO+6pOVXE_BV0&8z)h=KWNwad zce_(fV&Zqqk5U)zAfIueZ_sADn75aPG&;q5-Ty%)nD+)c5K?o8$Y`9%sI_}OMpm^y zdv3n$?t&&~j%HhXF2VWcS6wQDOV1&)L)Yn^K%Cxg&bg1xhc;cQ6wl@CHTj4LB+6P- z^FKuySv>(xHE2;X+&XH893$GE?;yeiEK)F#kAFDIE>VH}6o0bJO1T3cQ}ImVS+ok~ z$EyurI+Fq)XT8Q&0Je7>OfdWnPcT1|JxsiyBQ3gv)M%e@YHfDBF^S8-G_~R1uHb*I z0w_%2GjMGh zD`G&IOB0z* z&bi7M@5v85<1B`mhnY6d*gMBXm!w(Q+p*$I)t^1ViR?mIj^p`(N9bZ)*X5Yor!ha( z@NQJCk$-u+l!Ncy8G}rAk0(v^{z|$eLbtlOPpzJ`vEMynngX9uWQr@eC^0y5Jj&M{ z$W3MPXbek*g|_>Tpel4F?+m;Yyb7sjBsr@iIL$7fNsxz`+k;od%eP2#I*8dW>DMh6 z2DM(5Ez4vmvV(cr97k|YN-%F+p}em7BHJieEZ{AM;EeGq+suw&o}D+^!#F8`Eh&)# zz`5dl5$_oq^PL1J0kh-dklTOJIbL<;a@Fllgiz>@X+!POYE4;T$}|4@uV>!>kw zA60AYuJU4}=G|uLK{B7#Ax3$>v7f6`_H%XdAr`E4kG!FU|6_9mvsRxUe zvMVjc6HxmfWD4IdyT8)J;xhPVnOH{6q9NQv_ow|2((k|uK)>j(?@Yh0?7lnwq7A%d zA2|_r=^kQUg4f5}R?AeGE*m2EunyaZV0c>d`FgT{M?5an4%L+Sg8qx6_Y0vDtXCm$ zoF{m;x3vz#{%O~)S$&!}{UMQ{!j=Pk*QViR{E5WrLI1({>FutA5lrcB(JA5l7x2|A z^1st{_H4<2x1OI_ua6pD4jX0TJ1n*qneLP=a(WpJ$pvX ztjno(_pp^a8$z8LquFr62F8(U-U-*`%(f7eJAoK`ye~rfzMRe zQ60y{3t4*SQC+L~P_}FG%~-iUwpZi_+Ls4=T8k~_Ps})(?x+a&6x843RIf8TW+CRw($CO@0f`_)1qUm`d!FdyR3l^5ESOGFclqLE;t4uOW!98#j|jomnQ1Y znZ8rjd+FymK@3opk1ai(zP~IrleMc(wM~_-pN$Qt?6UFQryy$KdC%r67!9`5V%-n& zuMOO`7TKL?#CNBtd(&f5n8BAuwjfeG0jBPU$fV|@BX*{MU^MW0BA~UqnEX-lBKnf1 zmQ`DhH=*6pk@^PRZ1=5S>-MaV4($ytjwaOVWvX59o;pFH%d-GN9qAHg2lL@0k(6uJ8%W1a>+9SF2b5aphuey zQKO23ZMsg$COyhmA8d=g(K)8<&0H{j+&(o;rJ1U>Ke>Yvi0#mhS5uhXi-akvot^WP z1x1Yoo@Et@HPB*twIT2#Qiwpf4}YQTz1R$FsBP7ql+3s&u)`Jj2oHpJ8JxC4K1B5n zD^$PTNMwGN*42I(*BnPfifkBra0cz3pVNPHo-5EpHuAXAdvkW!3ibzHl^OJ|#k3VZ z?rT$9Cr*~Z1E%I{r)+Qvu-)6tBH`hNE)XnzLiRs^6IMhUVQGJN@MP-jh5$09NhR9%w}&NAfosP$cnVfvq_udE|UZKLE}_g2|ZsBDur zxHO(kg2B~mgi-iJ#~r-F(1S9ai#EQ{-JES|_$25~4DyZ&JK5akf9p#xnLO?Fa27k+ zUL})^P(=N$7Ue8~#~z$2?W5!2;AMrUC^5*!JaV$1YmD3c6ys8rL@?uWd(1CL*5@Pm z+_FFJ96CFD@Pz+ZFPV(M$o$i^_g9m;t4zTdO%iUTKHPZ0#_5F3<2T5SYxZs?`@F1z{HQL4^e|NCy+(xdMYq)6&tC-wjC<*%q4Qg*FOv3=*V|4ZaPV#dSzG_c*NHZ1C+ zr*Gh{*EXxGd!L~vsj9oRKAU%6pQKe@b}{7ybEPS|N?~n#p4zSxoH4GuOoXW|cKWVM z2B(#!#IQaIba(=X&ASJNNwW1RZ8CFO#i^J&)?c_%3=4WJo;QONEH%AX8PMaM!KLF_ zq#9Spro(yT%%3tJkz!l@4gAj!UY{XbrdPdBuKeIU8N%9HKBWyMr88K|me`ec$!oj) z9zwA~vUQL{D{Y=;Tvl?<+{-s3c=t*kG3c}QLK zYmbofo<152yv2sQPYVN`d{xt_&C7;~^JOcQJrxUzBG5tkn z`b**zOc?0zCkMLek-A^7w=2VK_ytfagp9{Gh zjMo?y|0tf#HwEJvddmjKHn;Kzdg+AS2l&?}bKN)`AzRB#C68f$KyPhYJ<#I`e8kAM zN42TU$mT2Ft+aC-OwK-pf3JMGB4-bGd!&u^Cy#CB9vOS8PX*}hs&=NvADj|tR}NVh zzVoqIPtH>m1cp}_MVq@6il^i;g77I2J_W)RH+uqyXkFE;wC~%9HeVH`bs1{Yy8oed z9RscVjO^U~sa_dfkc4+s!qh#H>We-xnoYSis&jOki4k^p->EuvlOz`u2YLT7Jj0dZ zZZC+Jh_30=`m}#-;!gUxNN!hGo^nq3s-r3z`!Yt&)H*>^JmN2;IVq(yn|+=@Ea>BwVy=cwCo5=hICdemX| z%yMhzHbcK<3-2hW+SZ+y$?YFGm4pQH>d%bN)vbfuCeC^%)XnV|pQ+m--8~58&36Z` zjqkeNse550_NMY(e;Hu6Uh=@XQj_+q&@NZ%n8vPCTz$MiuwuL{<&0_Wd@Hw52FK!M zRI%e#l7dY+9OA!d}Zz*x<7bl)X{ZTy&O>TZPp;r=Ag z`x&T4KhGZ$zjaW2$DsYQx<7a^W$N#DWrfrLJMw<;XFHf7@1Wcw2PQGxAz|52dqXcGsZ*-i%i%+qtf+n8okjWg=rQ;t^ z1!kY-QZVQHUr4ZN^68H#m}|d7!7I*Ca%`G%=1lc$KZ_YAerFt`$TIz5!rO{o$Jt)D zggehUc9Ounv`;P&=t@7G6W&oe=UyyJNTzA$ZQ>ALS|cNcW2P_}=PyGQVs8(K2x=udq(Ow37_u0ORsm~ zjWR+q&6qh`2}a>8`7p55-@#^Nlc{6&Me_yDzjC}P|LQsG^5ppk#c!yFxMuE06Xkiq zRew|bzINWP3_4Cy^1A!$1!rC%uNq70&AB1LeW=y<17{aQEjr4C*P7YRd`SBLEb?$nQppC z?}zu)^=U=*eOjh*B?IO9HR1Dt8@Tp!#q$zS8kfoOeFrm>gj0j zxB9dYSA1umww0@i_X~Y*_Gw*j_i4RcTa9Zsa6eZ#Ul=BHBLXSHDEBE`X^P_v|4VWmZ23RX?-E z8aHb6nD}GHDn(_on5|YzoORTwIE3B2Je+JGwJGknQOBQ=tKxINS76wkeC z-u$b7P*z^CXmMrL4fXzpo0m4;^26p;Evs)|6S(6iKfUv3KmWysU;gU%ci;1eKi<3P zPk(;!p@;vz<&mwAKDK?w&L?-Z@7}Zb`G3Fg;!7{@f92J;-+A}Id;fXAtNVjbKK<hfQY8D3vYT%0v-jMUd`SvoZP&}XtA7dPsRtkK6iXOAhp>4Y;c zx;1{>)F1!ufo;c}b@7!wCoZhpH}<5|iEmH%L|C9W@ZA`2+y4;DN+6xGcm=+|5(^wN5tFbQqTpDA&+xN1p#**T1SFp(&C247o|WpB4vfr`Q_N$%0Gp ziVhd2OYDf?7M(4&>SQj_&)@bNTE3Jwlm;nN9NTC*q};In57Q!LOSz|V*|~%sp+#sL z&viQ28C*iI)In^bIFe^_oy8UF7mGf@AB#q@MN-aCI)!#A>uj!QT7`ZoU+nKWTw!{p z4nk`xR~py(TwxyDxffc~xiYve;F7vXy`&!Ja-GK|wl9AsXJTxY49@J{L~KFnoYxm;3jsk87;>U$BF z_yXd*U(O|b5*`X4#8(mDXcCwBK2x~lC-s+lNS_he6B;FMC6^`_3FKfTjRYDAG!kee z&`7Z0*Ztb9d{`p-DvA*nj&~g;E}SOgJERGx&Hmp=8_r`VPtBkEwU4>pHLjO|a!sfo zYnocSxS`&@q@upQba92fthT(uKB3$QUD&W_QAHhrHU7HVYWor*O`e*YORKBO?PYbf zK6_ooO$`P&m{b*u7FCs1Rn++HwGCX0>~*Cziz^IVRW&{W%WA7@>*{@_W#QoI zMfnB8Lzk4+-AKXJ6*Y_fm60NsR4l2jyT$ISg_gmD)|W2vRaez4wl69z^HYFP=FL@g z{)WZ<$|c7JVj zm`Cwu5%F-8JQa0ywRNWaB|iTx6d-()I8#ww#gbBgLtTZvqNZH<8x=Q`s#L**iY4%$ z>fBP{H%%=qyHS`@4@)XkW$PP!zS=tC;b}dMYc!X^*tD|JdTIT1lTNuJ*bblk6-&rg z3hxyib1EusG^!ILcA(btW7Ik-EW6BZ&${&d>7_O2UzC}ZWpY(4s;a55yP<1IX^p+O zbRqnJ-I*6PhU2b8*h=gCb`N!|qdn{s8cfsbDyXk;xU#gSoGgURTIeqY*U;d6*fwjC z-LnKyH_ff7X!KQ-39}4wGs>FXP+H@!`k`=+W}1MgE1@-AIj5MOF-H*q^K~rxBS`0z zmDWtsQ^TwpTA|)#=a*M&JQ6p_US4)N2utNZv2*Hy8TL693OFluP%V*p)wT6dHkkAF z3H7E~2ye^?oe#p_7nWIdeeu;r`Sz-M`_j7Fn#CD*WJ|D`6d+|A(+^@hBAMo> z)~h};wETL-cf_K)T2eEAn&-Ll(#$M-#7u~A4b_&UE2gfs)tjH>E`df%v} zPKz*)dg;s&RUv!ykU{D7q)Ij-=}H@`mNYCG=)W*qs$X7(byAY8TG#HYYOJWPr+rFm zq(%Jr3-yYIattkEwWOiiUxnVWH=uY>xi{&WSvogHNp)W(V{@XUxV*NaUa?qVTT-Pg zyj?ohfL!ZsHVB*eHuf@@j%C37DYu4hx~M`oxJygx?X@5iYe7#C$q;Mpr$SWPNn2FX z8LP?+s&q?Ymt0aYrDH0}O<}(2q>qpYd`e=3WO_7;mI#pnYSe$51HY#qt<=2K8f=2el?X z;v|LGe~T~Te<*f*7kWJ3nI55IVFh-fLP}EwOw&Cs*j7fni<>ye@e=c|e!35-JCwsc zuo2aP$?3yOE;GbMIvd`79TF{OiiT3U1~&F^e*s0B?iO z;G63GQp(aQx|!HQRDJz`3RWZ`KefJF>Z%r3`t50X>2`4nGwj8cwM*zm1sB-8r8N~9 z_JW40@>=^cq(R`EaVRbHwe^GVm;(FCHCN>%%L)TVdTQXqh=GNR;Q@gZAFl8Eu>}jF^ zrcd)sOV2RIGvc7?zo_()lJyLVqG34<4>?NR6h}G9lOlcBNH<75=qc%3G5ibhQ{^|| z;_{^6 z^$<>}aw{7BhVjrv5o`k;bTDtFE=s3ST`}21%Qe_9_N=U;x*EBvl`*hB=+rgnAcTTX zeiJ4(9PKh03>OngAEw;P`FF1R)77QXvF21%>jMvx=z|L-mWG}+I)lh1PSRkaa1F&M z%V1U+LEXigv!u3Ge5b{OeG8ojHMKRU`I_?5I=s%XgQ^_la5p!`Gz?;J7?y-}-X!U) ze#RttVU-oqE7k3QQzXL_{U^K`@XckMGoic^C;n#pO)Aj{?I$Yte8DF^ZN;!w8q@@; zpb_x+7(rl}hqm%}&VOaW)T8H}TO)j5T*K%@8Z11Z^SH$E*Z(r?IHL_qqz$glTbNg; z=#BJmrC)S|soWB!Ho{XFqW9|R8t}lC4HCOQ2^EE-G2m86TCs2F*!rq^I)a~WYzzkQ zh3ds&sVUR7+W>(|yar}vBJCBUya^4spF*4J3JY)X<3$C5(H9MdLRAf4S8=mGEUH0?U}PqgE1g6781yWvZD6oJh;+tZ za1OrWN$O+y@Hj_Iab$Q>ull0SQGXS#v$Tp{gQM9`HExgrQ?vm!HMu^EyJX6VAMd#0 zh2YpJ4VT|L<+HfIPr0u75clUeUI^YX#nfcV3-iYm%IryeI`@cm$Hkx7o|~dIIX3&& zdLLibocB=u`dLq`w09j*`dROu@b3#hKK-qYC2d9bRo}JX?y{fGxxe_Z+p<16_LpmbIcVEoX2q z^YlWK%<0S8!dYCYT>l+3f@Z|u|0(^Wz&NxHvUVW@^ys?C8kwv^gzF^hBC_@&b(3|H z30$(?A?q6d6LtOXuAi)x#HypLFUtDh(7MXHimbat*ICxv!s}X6_lvn?O-FbTUdOqF zds*Z8pWq2-BftMI`6FvcBk@SqrDXjn7O!O8N!I*^@=VsMWGyS2cc=4w4wtNj2@ho* zOxC)Dm$C*XYh&T{t^Zrzilr;eFEmZ4E}u{aUWW()za}Xl>bFKZIzRKN*2(24p&Ma( z5uc@N;(qg~?4JU5a%$;*U=OedX!<_;rs!ZrKs(TPI(yH6c02pbfK9-yz&2n9um{)! z^qoO^I$g<`Y_A3SIIGA9w4cLXEC~m8N_cvomO^7}K96+3c7O(@Dg3>R#g8gs;r;tvJfRl27J?xWB#t8JV!?{sl0rdlJ zW>0!Aa3e1%I8e&=>Cgu(;-##uz>UED67D5Ge9Hu;0XNU=(<%k>w&hk}8}Gcuqbxh- zQ!cRRYRUm_25tZ*FJPaUgkRsMWz#7)mi1|CfF+B-4{TcuUOHmuP2>Z1uwQRCaO2JJ z5xDt>(1*}%T*lkwz|FV8H=sR0eZ{D7*whAKTPyj1$?GT&7y`zl>^s*(FVN9OI|F-w z9l*>VgCFPvCS!=2fN8)G&<#xf3Hg8}Kc${P-<{wS!|*fe0qg))0z(`6w9WF&*S18t zZoG^9z|FuCp#8rn7ufSV$^~ZL4c~z!z!Vg34=@|p`3LF`?6{Zq1v>sp{pe_$AA(=N z9^fXR{bA|}bO1YnCBR-_^54Njr)vWi0Yh8h7tsC)^Z}cI9TE=g0-Cl`A3NzE2R|_R zpMBa!V8_3Z8(;~aZ8DufdY~Pcyo34xJ9mN)*t3gx3{2A=_yBAJHUaH>p$`~(3cg}I zH$F}K34DflF{b;72WI}8c#Ka7=m2KEME!u9fgv$UFH=8Y(<|@+Q`CglS= z+0WPs>;d*lcqjN!+8yt}f1vMO75xC{`x<@%Hy%OGfF_N4 zVstxzm12BN{n{E}GH@d>6S!5v*<;lS^Z~_K+1YQE25bYmfgvkE0egUL!1xTpNA+vjz#d=;aN}t50qtYRC-K0oKnJixo{#C*iq0pV10A;lHz)RM zT>@?WTIB`cO(7hZd`iD&zYusTbO{{aueAX;13ToI@1n@A=%VlUYnhqw7w85y0ZV`# z_I_=HJfBTEVCWp`nML{O-~kq$OFe*{z?6%~e}2E#1hi+89_Yvd-^I{#DR_YPT*84q zC-t33eO=TOSTdtu+Yj_{CSNj!s129~>;$@jrXtb-ee?RY&A{YqpqZ)dErW)e2;XAMh*aNHt+Uwz?gx?0e zIq;zwz5q*FphMsq%AG{|K)>byhVCF{!zS?18f_uX(hmoe28>2 zuqj#7Oa+9G)3hR>op-!908OWAS|`wPn#Lz}DEIrCCa?6iovvvPpf6Qk5Cf)@4(Pa0 z(=t7zyGYZTfXSCozQD^Ue>(ZHHElj{bB?C10X9w2v`xSeFa+$mf^udM&KWZ$K)VO} zfE#($%;bfie0s77*ul4IHUfPMHLXXUtDvWle4J<32J|&Rk38Q3Ju``420g&0mCyrp z+zLIj;QMWwmJQqtECM>#fESqA3SOZ7$KWjj-<{wE+Bbj~*z-&HFdP2-8aja`z(!#5 ze`(roUpTFR z&<896`u;*ZunD*Z*aqAPH2oDkz>Wu~&s^x+LOd{YE9C$~kAvqb%H0N?z|GsC6Bq(^ z0y}}dz|0-+YaV<7x`8FY5_#T9I{|w*(WV!;c^CA~hn{xQ0ef~+9x!tc>45g9C|91J zrroaQ`5EX3CO-?kz@`q$1)5%(nIs+Bj!Y+UilRq|D~g1xXIe)nk(~32`RbrzWM4a%xiibRCcIWFqA? zfd>&$^Em0<>4UPk)UP7HxfT)u-v#{=3|li z&PcGl%fmFq-DwHJr-w;j#8_~O zk9@AS(z?xYmOttxkz7$Od>BXl+fMJ(?hpYT;6r{4KDd%LnyoDqnLTY7Csa!bzH;z& zq|#1C`RhgQM&hf_dXgn3x&p=6T<|>%KHoWg+QZxnee0y13^{g14Gi&;*elA6rc>evLk5@sc3=M8IiDV*;;aLJpU*_nOX2j7J+A+z-%DQ9?(QW{L? zz7Kr+FQR_mj!((upJNM>Ct<;`Vq9VVE})!oqmi#m`n0dP*ZETrLtd49%t$J-tQ~>s zrNc_0lS%vf!Jm97@4*RvT@OAQF5gAaoy2b@{ym8wv3-;tvg{jy|I+VY2haS=7}FYf z)>^O+;eOw!>=G17q;A6!$M9k|>D3#jM=#fUoH=&EQomyGv}N;s4?(QgZ+f^K(R+U4 zL&P^pJms{CK3FUIYqi*+=24cKBs-)M6`@b${yy@>=k#gP{NZ0NH#-S85neA5l(*V4 zBWyS3Mf9jE!D>am3}ZY)*V4M2#=!%}yrc?nb)*A?@=ycziD2 z!4&$GU9#K~ZXbyscMSTPc;zBZZ?>*h_T8hBNc|=fpPY~WjL{GC2lGql@x@jjx}g+& ztH5V3z@A0)@c{n^?5^r>o}{(}Ym)Tq;d&xsZ(b1km@Axyo*T;l0eprXFS2@Kqw_@c zd+J#5&Fs@2iqzLLSRW|<8}_2@IO}b(5k~0qgRiNmPrFe0BjRUFkAW{tpGBjxJLqk@ za5SFA(|CrS@hn~AIcX5#-%jwA%0Ef!QkoG7@>M>iNu^yd&N`Z< z;C+-Iv?eAt!|zOmq;lcpb$!})-TxZhYP}i+qt?c)vse~jm4q=;kF~%}*Y|1GNV}u+M?)9te0%Sc53RN$YZSBLU>m|S5u&lEln z_luOnDfpIwZ}$z%0e(Ba=}Api>t~~4;!^~cgYRkZb@}?VeS_OAHvjP3eiU0#Oi!?$ z6g!44n?X4faqLU#`?U3XdyZLexhBcCdi2^+t#RwDRy%p)Bl=bJNjd35e)Kch-JH?NMv&uktwBPlcNWk$?ZUcy}Ec18kpjKYU%@TDy6 z(*qWmpj8h`ikczLHz|w6)v|eQPZY#f|Zf#g~-g ziSiR9{R^ZIk-j66o?^o3e=~Tz<04I5GWc1;3Hzzh;|Vn`M&HS}xX9{9wucUk2lR~> zJn_rXUq=5M=GR~+EIX*>v?%vxdV+sQy%i^guDigudqtnNL-?rt8tSd)6>f?+G6e~i z4Ls;$ea4DA6+4)2kh=2|xj6uyqNc&~3L+Or2zL|ilZ3h-a6>qw$i?{MOr{OQKNHc% z19CA;-?g1+eg7zSFBN>%;7e)g)8xaMMnC^49l(`Pp}GNq`r7}Uq|030r=2eWs-G+h zlcoB}!^As?UoY`W*jHO_R*3X9+!u)7Ongs7{;(rPzg7NaK~kpm3Yt|U8J|)(Wfnx@v@@VdZ8#mcY;Nzgka421kd zPEt>xen0EeawR~?$@LWON|;0067M43LHrq!c$wkQehn~;C#8@M|6B=}d*j}iK2vga7y0M2Ce0Lcq@N?wir<3& zapE@+KV9OH6GPt7uF>sz<6yy-wERTB9U=cF@;__HL+p7e!>=!~Hb8NVVTV33D)_u7 zAs=`14Y0xf*TB5W;Bnf9*!XloE(hOT;On}lPrG#_e98|u>~fpgvNa}s`3ZQou?VLG zy?x_OW_)w+;BmE!xbcL?6CRX=@OQn;Gp@5Le^U7c1NE84JVvEVfbV^k?B6|5g@NC-Dr#)}b6Fu)~356v{B6azDo%Hkn)Teze0ZKj?w?)r) zD}88rBbI=u`ln#8{`_t8gle2-byo4;2I_Vopug-cqHBr<*O6Mr-Nu8N|o42Pam% zl;b5nh4>dGzoJhTlBn<;!zd6e?c^t22k8z;Iwi--KiAhIeiktW%EOZM_mIBrUwvA? zq*r+Hf8%E+ST+LO33&>;v63Woyg>SrC;GHUC4JPo(Cs9QUKct-x?a+C>*=D_g?E+ack9>S^$Ecb_)dkh|3~kF2k6E*&b@UeXtn-nWR?Y4_qttxKhf()(APX#oJ@S}OlE+Q zOj5u}oE2T|DL&_ZpYa)Z(gy3V*mU_U`(xJ9aCoGiYr(ha`PlQS!^T@a>npLVsS_yj z_&WHuzJR`vdg}5hBP~V^rGxsloU2yyVxM+)BwcwVUi48a@jl|En&F>>=Mr8?I3V(q za*K`h+a>f`;iXLWwOX0(lX)HGFd?F*Wu!}asZU!h>B9cBOos3iJa-9x;_sJ$`C{c( zTi03|LE%m)B4yMa%DwR@EjoC@iKZ#`qT8)amM;D>kN;OXh0t) z+R@+p`?N%og@3C4cJdP*U4JPzm+)-DoswAT%ViP1We~K0_)6mQC0^+{#$$#(8e*=M zpS_m!Ylf5~cGfn}kt4V2cGSXJK_?C^v14@yAPI$$NW)mJU` zbVo?H<`sj#QRy%#YED+NtNNco|6^}sg9I2q)&7Jx63%o>4W?jQawl`(I;S&CElr@(29cf+U}1 z<_M)&E6v07B^p>SN7}3SO#0IsjMt-oa5A*viBIe>Otzi z(6@?k`-kikiSTPgdu>fO$0ktlKMkIgj|S^02|qx1GU2$pk>5n_ju`3PqS%z2M)-%} zGX#}sfpw7wcY?^v#0iXNde{pc@h?W47j!YM$c`bDG^9RnnhU;F;A{KBm={!hWt!E8$We^>U5DlFA@foN3Ggy4FKVLEnSiiFPXP;ln!>ae{PTM`+fD*hdoX^{^?XB8 zN}kdiQs0M37b4v)(r!wgRefXo9h=S8hey(*mbI}eETyY&%Z@(>dHtHN&PU1_BA3zn zlKF>4@Nc+UDoC&fgn-zbT|il@C?~UT*!qrJ_8SeXKN$Y1Pc_pJ9jDq4?LWK>k=Fy@ z?*V^7L|%u~W1#;RB!#TjA01_&r{q5ke3t(2vOlUIsl#kNKemIdI)LC?1-{Jqer?uw zqR(tSE;hc1zx;yWJGNh2ZUwoL4^`h-^EPTd{rK4UltLH!Qq!?#$^BaO=t1~m`}0NC z`;LN6?R)csuj!pRvZNa-L~Ul=O=GWA^i8QvwR8pFf%=Fw~8u9Ed@acE`O zrrJ^H@RDxp8U5N_(vFG_wbx7BQ01pq6Q9jH1V13!SZ^r~`wgo96W>Vu6B0kYdCcn3 zg|ebLJE>&7W$h@-&n2z2$HSycPV3jwkJ`S5ALX+=8&lsI14iL%+FEfUXLCT`u*T7$>6(*5q%xYKXB{& z?~1H4cM?Nk>-IzR;ZE?GF6h@Tj{^?K`w;mw_~EerRJ!+YO~Go-$1w|1u384DGx)b( z-sup1I5#{Vu@oQ!>@E^-HR3iaxmiH^-i!OSM5!lovw9SAV+@4YcBuwJ%KnkAb0T~9 z4SpE%Nq;r=8h zP^5~@&+9DK6GRNBCx||JUFezBukGaC&^P}I*I)Ym5#s0bZqZ?hH+~X6?n3a-?$^hy zMmVBl${@UvaM^dQ`zPUXjpgNt-Zu1#l)r%V@pJn1`2jUP{z15SC6CLD_}?342#|KU zlkkn?JI&x@tA%zMx_M7j;5)d&Q0Hor&!6AZA_;mn$zPY?xBmv?10U6|a5{y+g zeO@w=iOnw3c?|tMu#eE%j>tz0lb{hk<&r-B8s4pu0OKe1E+#yg@XIAEyq~W}I&OAS(OPS(#j+wIH<3R=7&%bF?;*T{aLj+?C*hA1 zzMJrCBB6T!c|qt|ME{BCwSn=_kaEHV(eQ)PLH|{^#HOI!`|!btRhzrgD;tP8TT7<*sOMcpxu8&bLA&k zIsxHzWRZgdqz~O-_=gOmnk_R(F*PAywXVL#A^c37h=FC@IU}qm3Z5h2NxP|EJ0s#p7LJI=VjZSF z6h(r^bqVd^@7J0mc+@)a5dTa057tvqq(k+PXc)n>7CiHp_DAirjfF?~h1N@A=rggz zBCjuir{k7>t<2!hI?Jrce8RwfF6)QL*&v5X96f38ahLLMS-MB9GQ7q*5{{?O0BH=E{D3|02)wlkjDPXE*h0e^DX&KjFij zgm(~L6X7TOzDCgNR~@BYUI$NabAQx++E{+J-Yy@EfJgdo>Sf6D?fu%K$oN#*tJr?c ze5-p@tnO>nQSkY}*U7uVopC(GvVQ~f3a+FLX6yF2kr4{Mo#6BR7<(HTpN>dhLDFus zb^Pd~;~STa|M-i3?QetYJ4Bw1`Oq%2we=_!7W&G;7vi1eb0YMO*bW6rYb@5$-$LKR z;FEWn-;UrL(SImN+G?@xI0`AVOYrQaBt4to#Jx;=(I5lbQUdL2C3Tj-aOel#+k#29$Q zh6tY2Nz5NS+ONG6(YFKRgdz6S>WiV5!uqWmJlT(<2O@Yz)^8h8AVc+}(31f@4}&N9 zU+CLd`suU*{Uolq=$Qkg_dU_C?chHA6S+J>cv`4mJ0{ZZN0G~3v$gA6`k{9+_HAds z_EMzXhSV>*UvDy7Z;Fd)=+!_+=(`JijeDZ?*HQ4zxBiAEjNv!v<0fgxL*UDPhIiZ} z@_=0!L9d=2LmmW^;F*Y#Y3jf}MA~s=JXgh#2a!){$7SG2`8R%ofoH9(>xJ#ia|7)t z@+0kdAL-Lx#I8xZ8$Su(DfGMqJ>fv0@b7iP-7iPC$5H$)^x}K58K_2df-i#s&HmRo z1T)gUN5Qw>Y`rHoJ~f{r_?Cfh4c{o(7LmUZ?OZ_;diKiL@)E)KH2C8A)O;Z@VmQTyDrks3LjJV!}O3VsnY7SjEqjnO*Qzk5B6(c8vQnU zoG_qA@@3x3`sN7ZKAP0@FnD?nF~4iz8F4;yuzMrbQgZh>`7=Kn7#~Ex7ic}v9CmM1 z`v1k=o4{95WbMOUw=Xv>H$b3SLRfN1!WOmwVONQOhzbY_iV98yMO@ef1s5cuD2h6u zsJNqu;)bZ`xS+%xH^iAy8COO}M8^f!!8PCWoKxMm6BBTpnfIIb{U^U)Zq;+nsZ&*_ zmagv8)zuQe1p~3({M^nT`h4~A;0A&HZwUCC!I$-}q*D8h2Yn~#MPYxb(jMvgV88mS zdHz_<24s8O34L3>`nh6ZsISKRn*Hi;iMf+^qwh!P%ij5O#Z_Vdt5UwSU*LfHJ7ezY zySdH}FTr~Kr=KfM|26uSyY7*@(RVHMEss@HtP8L6QoiceU0Bz+?&Z6<&eMLMK%ciq zMfiSr_3yjNdJyZ7xV!Ie^zFG1#z%vS3hr0cb=)r61Nu(cjlPSZZ*G%{ilg|PUDky) zwg=WVad%M0uKUYd(6^{%Ma6Al`F1hCp#Qzb{Z(l5Dlb6F13ucX^B`Q`@+vB}h5c_A z<-_&z`Q7xtGof!$dwh!`)VGWBVSe7eoB8TR=o{9lqGI3O&ws<}FEVb2-RNsM82Y+a zRNPc~{!6ce_YL;}a{gPm+xZXrRu@(1^TQh3SLeT*YncByAFYF)6uuQxm-C5)3r79hhijs3VOlWW{;HI!@>X}}59s_+P2Uh5NZ0UMd zna8Ey$CmwK`q6Unx_>A1tcIQ|NP?bA_6NSI-bjoJTt1Mp`=4nU*<5ZS4LO- zn(rTQUwfvhuGyi7f5+f|JoIfjxT50BaJNbgeETY_XN~&ytG_np7VM^cPeI?3$rTj`g!*c{j~`NhiE$sV{=O`% zZ{q`@?}Unq>%w+Lzm4vDMqfnluhOvlCGlQh2Rx(+J#xW)>oL%`^+bHz40R9w*ssn6 zeGBN#10up={4cZeqew?TxR~GbxQP3X&g1()=hQ*J(p_C)Rx;nbh;%!lkGg|D#{UMo za}w4I0TJO4{Qqd>KPNpsFIT@F7!~_db;F(QIRrl|p#O%jf26P5>E~WUcwfi&&vxQ+ z@k`&eeKEHH`j$c8j;R&F`@495VgmeNvb!GstqWzyQf@uu7ERl=9IqRHgIsEQMa3*z zK6}5ofB1d@+7td8?Ed@3<8YZb3Pzy+;~RN+Tx8cUVxPPXee>*p(x>&Hr&o#mzmg#B zBmG+D&$M4{cwkp-+NfrBXD7rT^?d?;8+WTu{0nR+cnE9ON4xGh68C$vD=JQ~*PrNp zczQpn`zJe6Fvw8}_zif$VR_C(`sJrqRGbxFAF6y;BzpaVpRUs70ivo+9?wWSya;_8 z@$Ev{XD8PIT;KWrV3B+iCL1JN540sXE`Ef3-!pLkfq3vodgFs|eXfSy8T1a-(1(DY zs)jxu^lZ@MfpY4`|7_5+KyOfmei7&%=rl+0NBNsUcR-I`mjZrmSZje=3t&Bgxs88W zHdK`UUDixT)#?@+ZnWX;mcGN{r!4-94YOLRe2ERqZ1}C^*UMIZz71Dc{#G0IvGlA~ zD%aPBGi-Q><*&AQqYZc3@C3^r)>_jqw0N$?D{Q#YhBsRNIvYM`!?$d>!^(YbalEKSLlG8-Og`KvA7V#Dc{?uZi}^Q#R<*|5xp zi>=&Ri?`a)%hUXdY*=c;B{nR#;SL+7@>TvetM6GG4zu(!8?LqCW*hFb;Rja!dmE+- zRA2oZTW^b(+i`eY!LWQ zSC&n zWjb!FR=T&HkA~XtP#aFR;i)z}&xTjn@D>|BV8dr@_?iv3+3;H%Ch*LNe@$)J&W62h zIMjxR+HkTBPqpEBHoU@yx7hFj8$M&h*KD}WhTqySfoC|9zYW{ju(u6|+VD^tPPXBx zHayRUSJ?0t8$MveXKeVI4Y%3wTN@@0wE5exoeg{2aHtIrwc%tNo@&GMY$4ZpQvVz|xUhV5+F+lE7Jc&H60+wfEyI@f6b*>CXR{x}Q#*onsC`PtLVs{D2ajyc_MDN%me2o)#}E>6|TUz!T!`Hg=5%?vIA3d3L3 zKNxSJsQwbW5%iGY;u%V6MCIQ*HjrN-R}`E{SGS6wg(|;(VIW_AnlkPSE~ZtIsr;;) z1NpKt6}VxS`pIkeN-U7W0Ojp+q9~rVwE3(*Q{)R_(17vs~5NBUwBO*U$jjH zzpPh%0@Ys*_m}D~`dZ~028)p@$y7e~{Xl-y4=S)Wvx=aFDqk0$mskCcr>hV7UUD@_ zRK97CKz?%rm0z{X{&V)|K)y^i#^SkTu-L1Thw8s;dLUoYLiHcMOZ#uXB9LDp9}dK` zQH;>){#5_YwSoMSUaJ4yUG|@co)6?_^i}y|{pz&qyE8Fo<)?xC)&o`k!Cl(tl5BRb&ZO{!DxhROL$!RryK}cq8dl{tmn@W95%j`5iMOLXoJ-H|kNx$``$) z^6P_})rc&kDt{%88BqN@-cFlPJb5J^ zuX8-keU8O5`T;>~CIjQ$L6KO-Qw&VvERWqUT(Zi z#QR&k!g#L|A7JrnqPCuY>ZS5>4;Y~w=gm*PkXR@cTUiIc7 zLMr=*P+t$IzT@(;6<@`E5%c2TAgKR3e(J1Z2H0$NI>9XpGMUcDI1r69od#bbZ6cQs zyUZTAE+E8Tmdo&W&=_-`M$8VEGtt>50S4>zb!;O1ahVw%KCxHvq9;52Zy!GH#a*C6 zhL3v*qmkirEnzjoC*Hu!LG5Jt#Iwv$irL{4Z(^hOtoHglwcI(*_qW+GrXeB#~B@q+E}iTAL>#SWi%Z}STBa`Wx*i4Qaj zMBWac_%O3fupK_}{Vle`Cw_p%cKE~(wAc=x_;AB}mT>sQM@s3#;S(Qa*fHJwVEDxC z@QFW6lgRLiKcd#r;S*o4#?j#uFW1)Q@HqJYA5<(b zo%)nbcsm)TF8AC97&Uty$>>835j|!GqwDrSbh=PiH9>TdL`P$|)LAx>0#{}tdhZBE zk7JbYfI04k5J((2mcQOl$inTPKy>(IAsm2TcOKSAi4k*za3l#Wut-lFv_fu zmud`j+@mNvY9%NMZytW#(=bIQM)R1agh#;!=O)H)MVQ2;)JYu8C`LjupXj)OKWYX0`p6JU` zJSxEW+E#lN-m|XE>zSw`315}ELN1AJQ>ZDSXPWoWBDzUJa#y7xuR6EFYR`XN){wHGKXsw zbx3Zau~w>N=j3aRfNoY)l;k6e#BHp2EWbGU5qWoMy1vO*Xv8&&_DsgeyIWC7@*7+^ z54qe)Mn_28qi9%?ho>a&RWv;LLpz`cX`)#EsN`elNr^`|0%Q5((8g>ucPb09 z{zxQiP>^^$mVh-cqs5+39oCvpk`c>~H#}sPlXyy5jT;_vYzVR&?lZ+nJguCT4fi=I z1Suzz)J9MsEsA%*E})5?xs9grcok_BPrN<~e18#0j=v}JH$Fdy9`j#D3%S0BI>!BM zjs(ZOiKclcA8e$1?^LFHled0;58MzLe-LZyxI@@WwjBv>Mt`(xheX1B1km`{lTUUM z8RlikqOUZbdhArfTX0Q^<$K;6ELn!BgYg;5&+`6EB^fda#qzVge;^w`ZLyU1JuRPM zC(r^X<8tU@ncgUN=@(*MAT0BCg4TLHc02-^ zm(NE{6I(=FmNolQ`CFEcd3g=H_S=?^d3hZwlX%DCn+;lwX3WS!5vL?txHO#i7&~1n z_X{b$<9$ZEV^1g5+;uzaG6dzHWr-gV^m zbk&MQ-git}>^>>nzTTfW@cOx*3M}z%rD67V)yBiTIULRdZQ4=ZJ>(8`X&7{W?=ZH& z{uY*^TCbv_8O>3JRN`+jb^xz2bNe7{!Z&EC55=ULoNLSXR?Itr^<8N3)|gk!_B-F=zs0<#$X{gfcGQ>UyU^vGHA5%cz9@3_KTD($f|=J6b##8p;)x$FIb?RT}s*ScO;mgicVeueA(mEHI{ zbCaaM*=@{A-;I|2A|Nh)0o?31=H)Mde+I+_Fo0WJ?*!UnrA_>n>*dfEH=8eEQa69A z>ow;*x61OjyWYK=K5jR4Am--paJ^4*f$uQIf_J*!;?BT#nn{Ao;$8y2h{RpyQo)Pj zUZXR^FJi4A#B1NjC{^OiSh36pp0|l} z-Pf@)n1t7Z&uE%&Vpj;v_TJ{G`_^((m?k+5+8fe@cRl)8Cf73@#dbN7ITLaITb%H? zT9joZ$D&XhK+(kj^?5DLT39EU0|R6f zDe{tw(L*x2+lnNckXNjWgY4uc=*Z}$i1R=7*R6-?EGwfQn=yGG6ZbEI7}u;HQ+xog z8o0JVJPDDyeAy{0V;{D%iVq6Jw^4lX`Js4!ik|_)W@U_ECs6T`f%wzyA%4(Jq4@C> zUkfw#%{YU7B)I|B&p0!vWiPNZ<^{F<0oKeoE2!mEjH-iIR zk6&C-l5>d`UN5K!Ra(wWw<6Q5j4|wpTE?-O*h#*Ov5;}-#;}a_AX4{PG)pZBEA z4U3o4N>$B9yoJoW9Ap9YJj4?o7t{5*25+(k&68;6-X~<$E%a>EErFk9H7KZnqT=YfxAmwn0ft>##Lbm~MDOiJ0OR!p)TOrB? zVnm2dEt=9l(7BI@vomu6xm)oWBF=JhMXBPe z(XcUkrayrV;2!`B8h<~G_n7|(D7XWvhhdP>>?_DNHyotWC^<}n%yJPlH={!`3z#F& znvOxj>n&oO12lDIv7D2trkVgr?FO6(G!2EI>S9sFu@_M#3Yb;U_c$#!Hym>5#A<+0 z6uLO^x$V()GLEZ2G~w03xM^-U*fbeu-yA6{A2LKND7DM{8i@u%SVqYnNXb#CDQ#nr zs}1-$WU~GK z9MXPUq|Nb5VA&RaN65GIdqJ|5zZm*k`=yBI`UOap@~=dyHvVb&&GRosne+Vy_$}}= zA=%bvuWRQYit@Dg4~3o%{s>&%JNgHp{DuCJs8J{X9%$?AzXCgS@xMcjy84IXx0^o^ zX^Z@ykgB`i6@9pe&*`$K&)p2g{*#dJ<^PCs_V&MphCcoh%-?bsZ!5x9H%{7UUWzYOtm$LEy#xZ^*J;0edS3rU`I{0%7mQ;y#b!PAaE z7`1!G@jpRPo^||QsNY7%p9b`t<3Ed1KJWN1p)p@@{ISsTBAzY4h%Y(5gSu{V{BaO@ z+3~Ychs}#YNL2-fJaQyvIh&LVo4v4(v_#>eDZA<|`?>PQR;JxekaGE+>9se5S_gBXsjv~G1 z`1_#L?>qjx5c!+q_k_+59RDrkzRmHEK<*zp{s%zY9sg(WK63o4kl$A1zv+UfXN$o)GcM+1EC_@&6`2gknv=K0a_Z%2MVq0%VX&!{F;SD-hV z9w3`s6Fl6%=^ze1{WELe;cIzGor))xGJ8^-2%=9{qmr7S<6HMa}+roC!$zcOPn%1nLQ;UrUT zlRq6%vuE?b3@1@d78<8rz&CqVRx<^?$jmpJZSvG8Eiy}UBh<7PYtE+{Gq!ynw2Yb0 zS<;N5>CUF<_6Kb94b?2*!kN$eIxMHf&f%Kbj7FQyX1Z%kpuGEN&14A`-Ge&|ZL@2b z3m?q3sfVf3T*vA9UckJAY@xnEfdYF^x3oQwJfN+zv{n(?I!o&v((=t1Q{?15Zy5)K z3@7iemUdKx=GelX9HG^Ni zLW{s28)=Vr2|(U$nT<5|a>8K^0H3?IAqEX$8N2jz?0+Ys$F||J*u22Y&~t!!r(5NH zp_e5%6~CinXMwZIa(F(Ia-709EzM%IT{~)j$Lz3-eGk^Q`vkhppTe@f!?KoQY-?HH zVOcj2O5xsN;dTP%b+pOLZJro9odT5xnFhW4d79#5Gs=ojupzr;=ax__-ST5*+8zI$ zPd)l1h%?g@06PWZfkrer6pz8h#jb>vol;jmDt6FHO(8#nPWm(>etu2?~u1A^oF!tfB|Wn4;4O zZc!jly!pY%?oN*;=nWYQO+91*FY4DI_B1QeIvJ-LBa?=#CP6%~5!Mw$;zoLCKwMN0 z#K9o4h)OIrH$pOFB9hBO#&PaKcaAxHE^J+_@8cpj3FRrb_2`Z%iGP=%sI@Luc|)Pr z#VT(o)Vf%)ysve!V(O@MvDUg+YhA3kKEfIHU+ZGs){q4ZU91X27i$vhf{2T?NMPt< z{hh$j#d?Xrnp~_83O97Iz9+EO#j0-v)Vf%4=NQYcb+OjESaEk!>td~SvEttHzt+Xt z7Eg84F4p0KcHv?T#MQ-mW++~Ri!~5e7b~BS8?;Pmj_r*2@I_Y8UIHVHtmw zi}igK|7|YT0x8-qT&(+wK;U96Rq_8zF4n-Wx*99DgtrF2mHn#aLVt$zh+mZpJM}X1 zp;_QpeGydkt8%3m<>UTM9BIhn6A_}TlIy=3gc^d?!tfC#SA`Lw>iw#{MSLB^xoX_4 z_^~2R7ay0AD$cwjzCP>9TPBh$ELWH+$!vZp`55^0tL}mBxI4eW<{-*EH6zxq+pfUzIM>g!jE9;|SAayYZ`j1aZ22Lcc19o~E>oL9SMW<4{@F zuX-Q|%?+m=B}=aqmrBB$EIdv^X&#EV00jC~->dbj*7{Xz{i^?}U$u}vw{|9YqQB=M zn9}e!lAgSqL%(D@xG*UV=u(Fl3pvcyVt7^9_HPoL|e&@DQG zwP*=XQ0tGnGYx0pGYFf~2qQU7zX4ca1^|vC> zw5^slA*7+mu``iobZqH(C%1_$M(TmR6QG_7qnOAA{uhAKPlUPp@sKCgDC6Ih>Dd-D=1pD_k* zDK@@b3!Dyy4(!Ah*ZQjTeJbY~I80;CQn0MUY65CG3Cedmzs|u-gL}k?ny4@Fs!X9>^#) zaABI5d7z+Rd!XtIwg-|Y`t0_=BLf_64@`i5(PGXACQf!r$~EgEhQT*nJXxIK^? z`Tm*hfn6cb?Sb56RrB`1$>4_D1HT3cwgv)coeo5D27X)xR# z$WIDnay`RQYnKz5XClsjixVDKi?ThCV^OH|T`dQw&t*s^Ck!@gpkOGL+>Zu0y*-fD zx7!1?IKlQnMZxw!TM@fGklh=f60q9?6>)nY^#|Jn*^Igat;X$vO(7C&4`eH=c#Ycw z_ocYq9>`9h;x%p$oK11NJ&=9GZVwDx3bqF-O6_KQ;7Vp{ zw+FH#Y8l6B;$LnL%!Wv?J&^rW#U}*f)ol+{YjexqeoSn)2eMOZ;%PzRs@nt4rMTT5 z$Ud*)yWAeAs+iY(NRaT@v1EH-V{~NQ9w;%{9#{aHZVzNkx}Dt~SR7z(59CTCrzsWz z&__md!?lc10$0LNA#Mz>vqf;|WCVp1|5Yfwg-A z{|$Qrvt}66>;d?Q8qPRnqGPgoLBunUhLap4UT!Rh8Xk=e<@9mH@>30GfzeVyhlZyE zv{F#iaMEnMRWO#{H#rAKPM8!2Gwv~y{h{CF>0_vp5Z|HJc^Ll}$~vIR&NoT^=)s3uUJbzY&3r`zCOU zd@v4F{FP#@WK!_5qqMyXGxt<^x?$gbi^q&F6K64Z|c}XKIWE*^dor67&b-DFGuKqPt$vSZs~?qs0(w!u2KcrOIZAUBw70iSFDnAWV-f4 zsxW)^h%f`4Oyv~q$6oxVDX{|cC#aUmLdHHiZLl}lU`{dyvc!m3Xu%UH#tP; zIc96V&DMOIU>b(YJ5=lE5KXmcI?+r>zRQMw0Z7|jVE-0i&N|gGTd8wBQ1R2YWHd=L z6ezIa>EpGeq!$Z4(%P3tm=-v+F6mV9fd zC6e1Y%5aW41i1JLn-QmmV?eOuws@tb)0hh^T?fD{yfAQIgo_mJnVT^OjN$H4r*B87 zHfv&XPqft*|Ab?;8o9aP-JKUyV@-_Jn3)3Jo84M*!dI0EkYk%pW=;TYj0!JP_lTsh;cv>pofP$R8)VS5S9a_blnK zXX1Bsou#YiFN-_H?eHIZLZMr+f*GHHQQ@_wbk%uB8eJhL1k7V;fMC^B!#iFGd zJTYCGc~!)m;`1Zin=5hWMU^}n5qqJs*jbSxZH>5k}qh$iv1S}K4!7>3f>jo$z{16$ow-aN8E7}VS8yVpWuTeNRVE5<_ zHb(pyN%|a+4(hQosQdIplhi#f-C#H6Ym=}=$HdMOI~6&_gCinOR~8An_1K8W$5D~^ z(zVj9Y40l{LK(0U=MU*TWIh{V7DkvTN07;D5s`zUB4H*d?B@}osZpUAKI2?m$F>xE z#gfWg>03okzmyfx=AOak?xf9KYB`OMSCg%Q{mjU=L34MK=3Y}AGsBPT>MI;&?U%@cH>ZhY49Zi| zz{TxONcYu|xR}upv#cRFrqTS9A|f*@iv->IiipUv$|AhJurscXh&&V(340oZHbjKp ziVDd^QA+beMC7}Oh-A|C#B^<1wy#v1pd7^!k$s{fVL4FckrAO|qC&PDDC+SMk@Kq; z*&GqM-HLEB+X-${z`P^Wzd5^5n9|9;HUGc5N=*u%ic*4F!=*tTIp@8Viiq-)Yza6P=U6eds zWt{?Hyu+uaJ4BaiM9`44A|j(Ii^wbqEo&koQzIhMKJK)17K^&=~!X#diY6_yAT7d_Q;AFkF3zfvxh7! zP!t?lp(r@ALQ!yJg`(id3Pr(@6^ee%krgT#99g00pFgrf(*;LXC<>0OP!t?lp(r@A zLQ!yJg`$7$$O_eAty%fV3T4?ND-_rxD-_rxD-@)hOh*3i9$BH){Ldd*q50JGJr(7K zM^?ynk0*5{;EAZ_$O?+fn|d`IS)u$D;gJ=JcYS09_u2ANX^*T>_}}(D61#Z)LfPSw6$-;6D-?!DRw&#O9$BHd<|8YV|G($R3N7!iJhFmIckcW6 z?>n-B)!>m5@+w05oz(w{BP)V0p6HPkwck_uzx+KFcC+7nWCasrmGbXBvLbjV^|yXc zg@wxDxJJpU`<{yM`FKd)O@dH$-&6U8P<7u^5h1?682Ok96+>rr-&5IzcXhKN+FZ`a0G=3K?e%0@(*jm+oPo?&pirRB3{D03m6%EQw-Uv7%^p(_neyk0T z0g?`$^P9Guq_Mp>c>z5Y?G!amZY8fh2P60IJWtd?QOjg6yn1AMQXyVoO}@%>y(b8o zf#b@cj=(O}GS}gm!_+i(`PmNBho4Du`R1wVcMg6N9z|L$C1IEe{0>cKaEd@K_|E=Q zVCknshVfG(W^67GfinlrWs*@&>Iata7?ZL|n$OgvC&O!EP6MxvytR0Ye1-(HHcv3! zG5l24<@>`4Bg!UIS*ru!BO7kj&?bdQT_9dqr|ld|-#blfx8Bms7$wS!er+o(bxK;Y zeKT7qtIg@qmQ^_1$YE6}%Y5-6bHeDo=rBUP{{^ECPPvl4ipnIE7uzn8Wyw{j27Rrym;4>JOSCZm~qTo(at^X96; z-mqmvSA3~7&uq)JLsD|$X&+ay3Rf9ZZux=t_+gaMEJh|epTAq9;ky&iDOlmJMjhN;(Jsh_bGk7N}y8*IaO8LilXE|P~ zz)Q7rdXz-Cy$-WLy0Okjc)`DbZ+oCy^93ZQc&?SX!-mtLwzrJ6hh=Pa!tj1XN;49< zx4+1W1tUoHVZ%TjFyFV;smzRd<#-$Wbz~O!@cW!jV14*~4L``0QHHV1D&;H#PjBq{ znLD$=Io+6I(6Gsb9RA>t7gRjvyq63;`)}nq;@K~^<(pL|a?W#^5cKLqT>1mSsN&KO zJ^wS|X^$E24vNGwo?>7UcL}O<3wZ9w{JFRbDDK((xrEVw-m@>S75ty_>}!oe&%VO{ zEuMY$siuVW(RnVQN1-wa9qq<88ad7I_~!>g1n|{^sV_es~IINY#FLs;KtE zQ?(zS>e3W5#SGILH%D&%^D*zX81PKfQSgf~?>){WCtJKJ=3R$djKnP29O35Iet61B z+$e9ayZLD+Kd;Mfe$7sP<)@wewI80U{qR)AKD8g7s{Qa(?T4rEY>8jnsQS&K+7C}f zzBE<);VF7oconVv@KnCv0LCcrGn>G<;(yf$yW;#q<9G_}ABu%rhgv6pt&{)X<>b#c zjT*rdpiX|DUyP)ae=HvPo2F#I$qz?6eM{~N5}V0Kn_gtJc~|fgUN(MP-ABTqCU6m) zaXQ8^{!T6h`7Q{k7yeLw2;?!)a{1+EGmhVW`Uj!pcR2IQIU0BI@QWP5EJp*h*<#%e zdGh(8v3dNEQl5NBsRS8kw1A=orp#t|>=};yor09+emFlg;|0w4f{B3Qx;=-V(R%_g zzZsLC!|(8!(XAh6CC;TsiC?2=y-grzq`{MdBA>@1KLD6I8DB6W?<<1iENF2I06yR) zoWTGEpHs;q*368`HO%b-9y4$vc)5ELUPyQe;n5Tocn{%_ko#xA)THUy48NF#`vr4(#wq)DG*ZyA(XN z!+O^B4nS?X$7qMv$Eh7Qkar{j>>%Je0@y*o(*SCRa1~;4)8I{+Ug{5r33t(5MN2aW#SS_XB(5U_BhFgXMk(w zz*pW*UJ1#TE#c3C*iME*b3@BGQ*m*TvC!P8Y1+wP$Pr(8Z*bemXvmS<;z=cxYT*2mu!r?4!O0?Da%8bqL>$Lrvq+Z6%um#^? z!=sSe3~3cqpqEr2Z+cLH-co@hiKPO)r2a?lKx@An3wjHnuhQ0?IqA0tkv6Ft9Q85nI{L~8(t=;#Fw@*d@E@- z>e5~sW31H0jCH!0Ax?`~^7W^bUo5?KMJ`{*ZVE)rwHvYme#O!pvCF>ou##n(3;HGa`ubR##$O* zqtFsK-R4-DnWRK{(W&d@mP%*1mF)Vor7cd=+I(PXR>mocy1I)_M-c*7w^J9%V$PiU zq1$>1=7LF(C@a&F<}TK-WflbE@#Yv3mA%&-+yA2XTD+ZSLyvn2qY>}*N`8;gA&h@mjQ4A4)&#AM{#VfKm$4Prbc0w2js+?S(xqhC(O1m<>8GT zC*It`4&HKV&atq_8%o&1!oI<=NvgTTV;FC3xx>7*6wbA9l=n8dDGSGWJqiKy%zBhR zmS5`qNN$07Lf{mS=8m_sH444gBS4Mihu-V61kUyHnNg9!1dWGmWyV7@I`QrX!wh(V z@qQ-1huH|-ZvHvOYen4KY!M9CNE70L<^qw&Nd?am4>Q*YhHGRK@%|RCFy5=g2Uwgw zHc92z8t;Abhx70>M#tNRdw?D)epN%9ctctow^B$Gtz)i_>q zPCuY>H3k=03y~n<-GkJb>?y2Qy=91y%Kjl#?!XkP59-$d^(mY1Dj20MSH0I08GWcB zu2jd&VRYRdh)x&kD%?@jStQZXE~3lC;s-N&t;nh)Tl(>pnV{Y~h8ljcTm59DNO*Dl zy8RP~4nIc-$B{6P50ghM6T(~)TJUM~L8}nWY=EEp@h{Z~Pf#icCE;C-UweYmD?*^4 zdp?G7V$6F&U}_$zR6h>$E@L)FGs+cfKGAXGnF9UC$t*&wHF!ZronVf{l&I-}H}M=DJd6db9f`smqii`fGNF`Q0eWa3V2|U}10?)Rhz_YC=@N6pzJll!_&o)hz zK2nJTFP1+Jy?~8ok5syV*2IxYMd)GnNF~(~Y+olMJW@$n|J?TV5-5-s4UbfMo&Ctm zLG^Jo((8O{@SizSX*A?{q|(hy$FHtBevb@X!2Ln2t>X@<3+>x305?2RsTugekxD-y zj;_49F)qQi&hE zXFeM-;1g?O$_^%L+`fJ#q@zbFQ9SC| zR({&Et$a-1>rk1*J2AzweVt|uk5r=Jf+Lk0#MR)lT7&O523n*ZUK$U5S2f7MdlNU*g@0u9Vo@ zRU3y#DrwsANF~m<=>FbeY=QkPbQ~cB0*WZBp;7Fx? zSxN71^v&Q%rNe|W0l(=Zm3-7LI8v!ncWr7ab=Rh*Qg>}Cms)ls>8?#Hch{zNl@M-U z=h-AUyxm*KD+dl4mDwotY%2_pRMJisZeQn^jU1_TvZxA=R2n0e4!5r>47abV=I}@* zh2fD(no&*L*EQepNTt&x-|$GK`2xcul{j-rPq#-Z{T}S-kxGio!y}be34d$o*;brB zQb}=Hc%+h!jP&;P`z3w)NF}|ntq6})Qk*_gNpbo}CB^9@l@zaq=eRLiXuPzao1fmk z&IvGjq!R7y=GVM^UG=4pRO02;&EFXFj$sct(I|c{=2_3S;ZD0Qm%SktXtLruAJh#fWZQ8TlvjO=#T4TeW5y@-o@ zCf73@wRSm?c?077w;0QKtY&1{$gwC?9;x&QKz%MlGC5(eSpx;E#?}C*x3AOs_DCfy zPH?1>qTom+TM>Jt61z9IWbu%Zj9!ZP`4Z|6j#OeZ>Zv{b50Pt^lhp0&rwj5R-VY+d zkxFc36(1CcZ=?3Xw};|WC~l8bVkc1Xk%2gOV`LokbSQo$#qE(w>?8I_rJ$C2q*72z zJyI#Cr5>rIC^%9{QOX{vbUWrLTv3v95oRoWTu>3J^b9lIinhzj7{iXJWgM%CgCmvx z9+q(cM1mug*iTh_LLjb3Dm4`CUh;md2r?$AwRw|w0u$RKmDs5@@w6bZ9;tM&CWiQ} z6t_nzvCpgcDYHbtN%9Na8K+)i^Wq2iGv=r&=Jgs9Cp>m6IZ~+)((92*5}V~D9*gY< zntsKJG3jMaEyhU^QZI-U$5}eD8Xy#f)EAI)+oS7b z9G3^tgx3MT%?(GGCgYTwBZcLohKL2FcA3o}I1&FcH1vgS&^{tR7|#e+_QflK%NfmFd5Qi%&g&0G|HT_h<07+UE)_ z%RdI(hW(45uRn5G-SR{wc3Ub6Wtu?WrulS2mX>XTcb(WJHjx%sP2 z@?OG%?E*KNM~PiGe2U17Ult{GPlA!YS1zo^sBjmV$d=gwDW0zV$ic`Q0^5~gPu);ZYC6i zE?`afI2}+7DsT{>8uXk>20fn!T@0ogbP>DC8bUGX1?(xW0IESRWcfmaE~cWd!OV}@ zI`p^U1rSq%E@PL^K0_@i+mFit)Ph&gf;R&?1%ZNJSP)I&WKzc;pfa%FU|MjUDYdy> zb|LuqdmF0E1U#Tu3$CLDyUjyx(sLeQMK1x&;}-cpurZ$^b2bz!{DI7Xw=djGDKY(n zH2u?r`{qFOA*TF+@Ec6O=3(B%H9|>Jomi?z*aOc7Y_|kr%Ry>?0y8+@3?qXJIhN#`o9bA7}UGpZvR?N4HqhrugY7pd;7h-v%6oz~@b)S~Vx`qYf+g1+n2y+whueQ(S&&Qq9W z?B~f}L#ZY~B4xe6f7+lHI1Wpb%5LC+VEl`2VD|CaP0TQ3e&_}sN~`9FZeWF>8<;b1 zEI)JuPo(`KZs6kur`^Dhqs60c;8z5v-M|Y(KJ5lxCOGW|Rt!IabptC-yMYy_-N40? zKJ5l(>1#JJ!v^a6o#}FcF&4kp_q#v{e6h&-et8>{$*+&B#J_xbCG`ES0VUxr!msuH zZV&~C;`<#Ami7HI zN)77!9WN;G{i?oTS2KB{558Y+t2!ybq3^dDDD?fV!!^YEezlhezF$Sbr^^)upDtGv ze7amw@ab|z!Kcd=1)nbG`(J6_ucE;BtCE55S5ffka+M5xzls9iFDst*{c5_v_p2!I z{VEE4zls9iucE;Bt0?gO(nM+BFGrjDe%WZ&_dAEygzvX?0@l2&9{R`=sw43Ik`elT zm1TXu3hbxL71&RgD@f@%;$0KAMMK~3(0A`=wzbzF&o<=!jpiT6CzVu&bFJ zAn^UF0>`tyUriDEeieqFF4txVKV7bn&;B>UP=W84zFIt~O{9Il>J8=+E$#c|^Vh)l zTdBJ?HI=$+Q&XwCHZ_&HYg5@~ijTl~-{Z2KXew_|#_~ho?-9r);`_C8)34jr%rP7B z{g#TV(Dyq+EFJoO6^6cF%_#K!Dhz$UYPZn$t1$d@x#k=CevgxUL*MUIfuZl0Ggs92 zI}hxr?^kho==>4d?^khI==){apg;U{`ASKj_WkOGZAIw&Rh;(yDo*=; z6{mf_iqpPd%`ffy=G-ho3H2eQDpX?pjX!eif&EzlzhoUtaE`zF);@ z->>RV`+nK7QQxof)4pFVU)uMpcx(9Sa>aj(c~9|;m_^cmaTa#WOEv|*P~HJ{^V7ax zl~4PA*GPM$eZN|swC`7O+V`vJ)4t!wBz@@nRd(q6RTzG{Tw(a>a)rNrS92RY7moUV zM+r{*e&-8L`+nC5PWyhbn*{08zTbldr+vS_7o7I}J|;Nr`~5+1+V^YZDw6j7YW>XLZ$EbHh}tEhGcTWV6z4aSdC2qPWygoee3(x;sm~5MS<_v zR>b;#*}c=gUqzh%sXy@jvKiIA*nhNKy8_?uTtW2xwueaI`(-Pu_@F>seZQ+i@k1$Y zeZTAkDn2q0SKsfGq4+|ITi-AHi1qyjwN&44P)qgw2DMb*ucE;Bt0-lCzpES50)g*$ zgCP2T*D+J;`(;PeGLF^6f$x`J%0nlCct?l?zF+oJ6`v4@tM9jgXb*h9YHj*s$1$<> z{jyVQ;%Px*_5F_0#1Oxn;@0=eKCj}Z%oKsZ_j{4eOMSnpih1#|N5Yei#g4>vnRKjy z>I?1#tiE80i7$9x&~#bMm`KAHd@YD$1595qR~|X-u_%CkGMXE%ZG;l+az0MTTsSKE z3J62`ED#djHTbRnAujvP4T~$@OORI}-a?iI9CQKoUc>`m@ShP+cyHjhvM=}(p?^ub z^#w0Oc3kMC3#H$+OL#jW)k1cQaOD@_bHbIq$;cubtQKY+C|nQLAheeVZG=9q5+g!v z?_ch6o+#p5Aodrp4d(H-$hFg%J zYK^Gk0F0<2PwU6N4XNiuisLSwSOr2+NPP||SAD@Lh$g&t_-$@D;xrkj;2bIJ$}op? z$H;5~!BYIo(4a4vLs3)O#voTK!f~mr4O)>oAT&3ehLp^b2k%Z?Dm+d~X&&ni0)4^t z@wB+s7wjL2*6HNmQx{K<{a0YrF8+5|e0B8?$8R^E1FXpZ2{$y|{jRtc_we7v6xh=r z3U0CgB;HiS@rdQ#&17=Ib{0#@6^MmaQ)sGJA3*Ya9P;P{|MZ@ zeJ<<=`elfhJN{}YecbUMM(~8=--RSkI{tJxG1IS(yqqP+>m~Z!8&-{UKob>w~IH$32+L0i{g6(~MpMZ-;t~59alnsfSZw z4ApYI_HHwv!}KP#Z*nMgjZ@8gCeLC)j-(1aW=OtFG+t3@vKh7f?iTR)G&H#fnWYL> znB;P5J(g1zA7Cf5(O=E+To>bQTa)}4O<_(bM)~m>D3cUN&53;X3tvJq$uF>qHPcuI z-i{`xQuB1ZyZf7IIA~v->#JzHNxs?-%$dCS<8}f2aaN!_{1?-@nBc~uLYWVM!vB!k zg$c${@vQ41;6BavI^~ZLNqFn=+n}#Gqd7cxTJSUNf?mr#kL8Bl8%{a}TXoM;J7#Gm z=Ccy9{36GFv>!B!TKDkx>52MrC@ z`l!B$KO{adCpDjp7m(z~Fv$y&Bv+i=FG-%cl0@T9KEL2=S{f7hy3Sb4%yEG^7xaPf zDi%o5TZ)>=Ahwmd=1N`f1$I(%SXdLRp+aV_PsBBQ08Eb%;?g?^mI&{#Hh$gz%@qM~xd`SI~Du~u~2)uHaY z;<7?4vz6I$F*x{pm6iGi#VwHDdY6>4{dvH9v#Z|~=Qa2$;I>lfyW?!HzY%j5Fl!~d zob%y^q$^qBXu!7OFTN+vb-{DM9cZ{MHuEfaAI%f-j`Kh(Sp?thOhis)2T5$Oqaoo+FHFvsRXlWM16y2_&-ETBoEhl%WSjcGsY+8a>Bqq9%?Kt%k!0Xw{H*zw#h42() zXKrL`zC*ZR6i?M6cJkgsCD?yv+`+!>C!g(+tez>or3q5wVc z*#ZHJ0lI(A5(>PVyjg+dPBI5ELt&1&6vnxO@YXz}z!3qb^!$cNSN9aSc24)E3BcP% zAj|6^+&LR1=3gD~VG-SC{5T53zb^F1cM*@gJmP1m<>rRkip5%(qNr;~gwU%QfVrcN zNuhB3n|!&3+mWHU9(_`~+#Pjj(EiJSWp=%z4lQ~Wuy(n->afclhQ!jv*3_Y$E+&-8 zLGe?-+U4%9!!9=gGePeUF4GLzy?@k-VOuw9gI7{e9eicHi#fPK@P+c81!p>W`K3cpnq9yc?rQ2uf)@hzyeIX@LxcDoGbombMb?0wtg?0$zqxZq*cAQuqe zKHSS`{vKyqcj=C4eZD9DBz~pf71R4HV_SY|@!C10T;NiAhrJp&=yWOe zKyw5xDHWjVCFKacB1i{6LaqX>_eHfK#g3CJD-JzMBUjcNzY}_!JbaGeWQk&N%L`PI zHR|tBYX0qg4V27ogGKMn;F?4Ftz|I2-+Bh4JFr-#HVOBAn+>M_CeZpn!Jh~4Q@9o6 z0dF8SU>jiylk=WmA!d$p@YiZ3r<0HE_4IaRq}S7r_1b!1ws2Vod28nrEo-Z{*is8@ zs^`K~3nZ1(syz+VQ`v4oUZAw6DitI3j2NkB#7KSQyb(20-?WkTvqoxlHFI9(%4Nm8 z7^+_8%344!bj#fIg>IS4vbVm31-jhj9MZZiHE3KfbXST@u1gskmrL_YYziV8*{Jl$UJGGppwlVKmNs~Ly8P|fhrc*FtcDkI4Ub+rgE`K{+ zUj8~?AIwGHyPS)TA(pky4=xuruM^AV@JGph@m=WIyc{Zg0#N6spIpvO2du#j5}V>H zTbNRG1d|nizauVplR>Y5K*u8xnYI>@k%;_(kwJ)@e-9$P5xMqW^q}$>u5u>>eFoI& zEJOycL*zn4hTf0J6^Ojc$O=TdJb=jUh&;>4Iz)bAWCJ2^{{bap-w8^TLaojH?v4WF z_7&)lK8VPN6ky~{MDiX&{$&vBQ~`7$P^Tm`HGdcbWe3RbAZe#;P_}@wR{^Zl5aWk` zC2{E9-z=f--k?u;1e*9#b*DihBOs1*;DIbEM!A&O+45&cs67j3R9Sin!*Putqce*!I1`MgJM<;xH$+{_}g^6P=5 z@)I9J<+E^!d=p8f@;`tgmG6G7=2!|YDt|F`hm~IfqLg>>29$Sz6%ETPmG7`p6%4gu zrOH=jin29S*29X2%ABsHRY_9$h1aS6au#r-`*Ay4`B$JtDxXnqE58pSg*#YeR(>9k zRQ@|e_U69KEl4Vrzw~ii`7f;QGH_A(3#mJ-{8|vDym?Qcygyjcu)I?F)Cx!bN^DrE z@>Q9lY+ouXwBn&Mr|aQWNmBWTF@X8El?8mq{jj~Q{1j-B%3se2yZtAK6s9t4<@bKl zR{kqQ_MQRqt4J!9zu_rc`8GGG?s9NZ`ST%=uKW%VrM%sqMtM71(XhNy`Quiof(vX| zsq$5sqU>NQn`OmAWlq{w^Hx^ri^;SR?osTD`ou{;$7dYw&FpBZ>_H4Rhgo! z-bN_9>=zZsH=a1THMG@#&W7d@_fbx{oZyO(QYw20BdqLPL<&n-Om_3@fux&vdJg0n zB(t&?0Ll2CXLYUx2bG=LFl9;~Vi zE!=sz?ar^D6gHQxUsttC2QFor-2{33WpR1v#XDXK+HmOYcpf4P5Gfo5PN(aE9s}Bo ztCAqi5^&6Crams79oJj&4zzP1z|Az~TqE{<52?kzIWHhW`-=7*5E1*10a@((B_f4I zNg&#{!;99wr`Up)fdl)#R0u6$XIe{f+IJDeyPj=DL;H5%#p5QdGma*a%78$MZ66D{+(z@g8;2ysTwR|6ujg0WCdI!G@ z)AGZCpW1|_FofA+-tLSfXMnyI0v)F#@*N|S5Sg|aEy5(@Zq_`?ndAi{;(q{B#6M+( z;{9JiQ#$pK-y)zHK)Oh_iA%sSYfQ&YDcnDU+3^WP-eQD{~E8C_jsxMU-*ai90P`5#4 zAzyqMKx+-4r8-;@kzYdjcTGpG`rn0YN8SZA`!gapBXSTT_}goB3Jx%ve>qdUVV+?Q ztm{Gwv#yUY!n%HeNTJif*0ueswyu{UQb^ab)V1(6)b)!PRX1_9BY#&RZ_}w8R>krVs6xcQ z1F=BvN-E@zVBG6=)oWryk?KXjz1aUsZdD~qP!p4gZR?6VsE2iphP{44cEOJ5fITwfYNq4|EUiPg=!ze=_}z;QpjljQ1y-fc05PZjARQ zi8q1e@n%YzVozeZr&7FySnjLZ2><-IfaU%rPw;oZa{r>R=xsoJCDG&ycP(IBxw|Wf ztwiow?*PlwzP2&m-dqH{7dy+K+q4cvS*XLdWP~0xD+Og3Pql?8hbnVK>|)kpQwk5?-m?W6%ZL;Nk-{B8L9PRm zf_y=8Q6pQB#qXma3-6F}I4sDiP#E;nMf?yTAOJt&ij3U z#E6fPOc%Pe=8%tI#PjY-8}Sh+q!nnH$0Bq~gW#YE)((NeAnFYHj0T%+hn^KUWu59> zflSQhy#s^I7K45HabU37Vz9!$2L?M;40Z#t7;KJM;_-h>-*g{$yO$r9TV|!V2b#qj8ObtL<;#ffL!03 zd}&ARI-8gd{owjO9ZYHGRgAEm-$bO4JGP~r8-8Wmc^)E#Sxsy^H~kvzJa(;?pMzy( zv9|N6XwZuzbha~S`X{yCX1SxF3!hlLuNU%VtxtwZsm6PZuo{PbV{7f)tLfJ=iLLbt zFh%?)Mks#3w-Pl;la0*OJVVjQ<`bS$v=BWJ&U&(B?Ymi3mMilHNNknb*{V)8d^o*QuH* zN{cUDi}PlCPqI{w%CfZdpc$4-5%G9^}1CETgrFJh(ghCmoGV1x@-{N28*i6+rtQG{`Z{g!>3^+u5y= zYqom@%76#rPWwRzJEpli0`PP~4&EG*t{~*#RfvN_?ci-84=JxBmciT78psyV%>c}lg!{Uqme7( zN!N-OF+%Zqh!mDXM7s3~AnDf4Y~rluNNgAD$vDzHk-~iuBM%@l2a&>3h)8F;8b~@* zP95qbnVsnwpx$>_ee6s#Pj8J@l zhgxk#L@aeKkXXt*sQIN@q%HLhm}05Mdmutf9e_yT42X!OE&~!vwXX~EW|C>CKLPc= z&g!G3u14VlOT8MQSGE)O0f7 zFEhYEU&fgs4KqU+7-YyfDhMhFh>C#~0TmSy0mT4{iVI>`P(TbQ#>I?jSH*yWVn7rV zt|FqCFoKFahcu3L4^Y1ZU;U|P-uo77|p zAgReeiFPpZq$Ue1SI9=KVOrSIxWc zBic0P{nhfEgW$$9cI&3px#V9I-jOHW(5b^CK|%xL+w)LyR4 zo8Zn{?+iL*@y_5xz;c{Yyh5c+qV$1Tqk2$PO%S|4z`){hO33gs8SHV&G!W%D`Nl~|7CIAtXuIZkPv26`#cJWd%4NRF%iZVTN83XW46uuz^od_(r)#$e}hLt#DR z?EQ>oWtTuTc--+cb-Vdfup%}fFEtMJ}OnZ*4(1@y>rpuTec zD!dTc{8jX})l2tOUbMVlSflWng#1p&`x>DBr)8U$t)QcyV1A5+y)Y=c_X-Ea zX>!T^XCQS@Op{CP4*|;$tuy3OyM6&cxztv8IAHx{b*5Zue+szqyDadmY>MvOgvvWR zyD!qX<3G3a&PITzTX^}ooi2M^E5pn7O|~UdFl9Ex@ZZJoEo|l4!deg-PQxx1{|0c) zEFN~ zu!=?uexaCrm^L}n)9`aJml)t%G{#Ipw#~MTzpMm+zn_4w_H_?Ko-cw%TsY}1!8byl zD;R}5S1<~Bu3!}M{6YL)aZ96+=PLxP_I0-*&s95N$a7Ur81kGGK;J2I4wUBkJh>24 z9QyFfTqAZG0Kw8%K(GvX{sn+q*CGRK`I)3F8}j@}CN<>wBqlZFxnMQqxg;6mBzwUa zGH7sfZgg#Ma}hQd4Bi3sWcU1EP=s}Gr&+k?b49QY?zAlT{3D6b;O29X6bJXkNJxbv z2X}6VJ%0vy8GOVWMtgnFCnNpYH{;v-voqHW(6ecM_{n>d@?UsiA>?$wxXD3bMS%3DSAsqR${{;E;XJ4ER@%X9Zc;{*7{WtyD z)sVJ9&L>#SyoCzwi9fq?hW_jdh5qbp_(729^hZhjb+XgTL#>oRRbDt zo;X^-$e;Z(0V98Q)kNga{*X{3fA;qUjAEIqjw63|&HKmx?60HOB7b%cfY6^^1^lP} z>~}&@p+EaxknZ{CL62c9^K!wo!Dq&w{ll8!aLqSWhHJj5GFBPEAG#J49IbRc7<0){_K25Pu!nf;fz1K!ZUa4&puo7XZ+dq!L~H=XID7m z&#rLBpIzaMKfA)a_h;t<`0x0$tGxf7KfB7$__MQTNjxLs{_LFu z&iJ!W5qN2q&lqRkz2-)NGyd%KQ%jU){MkPg`1kzTxtxUl>(3sxQvKP(R;oXH*h=+hS19ynSE$(fv-78Z#-IHPf#}b^n1yaep@?P9fv9ynL^Fr} z?2kottO=ITpPl1W*++%!>d(GK*=;Oy)i!<1doZ*0XXl{S%oD@R8&Rp`q%x@*wS6Yp ztv@@*yt1Fh-zn^za`avDbY8g8Z%+N$RTRsj-=*hsU`Z_V6b7>TuS-h&*BK^9t?QYR zVQ2l<%R`v{>)dG+eWl=^A^u~u53$S_pg3;qGL;Jb*Vh7D-|$B# zcY1L;P(@s2QN-uMbQ=Kf|8~Pv2c-JuTCj3g7-M4pilod3WOfpEhGyrk@ekRL6?WE> z+el?+Ss9t)o(;hZgp-x!4pTW<%x^g#2c7=wDGbLy@?ZZ1yoH7{Q+lF^c~F?TwGW8U ztYDFVR(1UH{8nHnG@SUFyDD4Jgk5tD2dDNuXTRnl6GWXaqB!AVqC^0T3J2U0;o>~Y zWL5=4tdK?Lc+{h!-4{-&po`sD# zjd~Q}Z1^*KV)-j*A45X1oXHl$eXG)G{EHs_U_*0N}3#7fID8+|?)C*i--iKALOw3AcUPRiAL<2r0+KV(s0-r!y|Sa&~Y_ zyJx4pM$1&$gA;B>XnlV#TuC&=d35#LI;$hJI*T1P5Zz_r4SK#qN2F6TAzS51gPqWPa!b8&Ud4PH+TD z|JVsW1oVj$>;!GA6I_K1pE|)~`1;HV9*30AouCAF`Cp(|l=r0*{0w1VIl(X(jcs#+ zB#QlCiO^bml4;Nz_YxWrwIMI(c`v*a=lrHIS85nCP)Pe%>o)IUP*J1|&u$NznrEGlK(D9z z^Lnb06wsdqH0FEn&3;FK0dH1h`cxBMMBMZwkodbBw^?Qw?o^sc$i-7B;*ti&Y4R0v znaQk>X$bHxW}nQ(_jH2W2~J@PKLc1I1)au%MmI7}>9&<3+bM?JGPxNmLny%MaN|3~ z7MsD&0LL)6l$M#{@OmjTBf(c@4$qqZ5KVcTodlW7ZKmW?D%PFmn}0xb^D{ua2L(32 z0EthKXmJ@5O&Y^fhxvZkC7t;1prDk(Q*D0Oec+aoe z7de+hn3;!bAJyLu>hHT^Xs84gG&|Vq=QIg5^gT874Zt>xS@r{e0UcZdqWJXx$cxdr z08880GR8qH6-DJBE+qBjPjX5xwB#98$xiFAPML~V#yvDD&q8^jhlW$!3S-V$j|$nV zs;MQ8Tve^K;JtFNk@ADkc$7iB-te@QX@Vc|^`r@$CU~)z36l6) zWr7Ac-GABywE#V1f_nH`V}kYIeAWalL3_>wo$>X&2~Gy`1rziJ^r8t)1GLTr`vH0h z8IW(a2?pV7tqICNd)WjV@U`9qt?>1V3EJW7RTFf@*J~zd3eML}&dosCRmNHttPk)ET5X-Q+$19f_w4x zxd|S|*B2&u5?^1M;5mGKWr9-FWt#~u0Q8FqwjldX6SM`=1n1&&rt2g|fM$mC;;wcd zbJ(Tm1-&pFN!M3i7hKzl5kYUXT!sAM`KPlhOYwD zi@uY2%hdSvV-V%?WL_c_%WLr_(c{`_avRvfJDh($1q}Y)z_pSYhWnxtzK3f6QrtN` ziNq^Nl&(dhLz!{PnDJwqVNx;66z&s2Yq}J0GjcX(z80ZeQ=YjZYq^0HKilA4qw?3z ze*X>m&03V*N^Tg>X5HPU2q4#8_&Gw40a(${^0OLugB_v~=BykShyJfl>rk2@*_H|# z?&n6}c8;#dW`b+_SQ-1-Z{8FZ)rVJ|6g|OZ*(*_4>ySZ|k`d?n|G>JtiH)CShFT$W z?DvnzXs&@YZOAMN>)#9wDI7$8cErs9D<)cg*7Pi}M-9n7-AVmW=Clq4?$Q4a&1H0x{f!w`3bE~uX1~oB`_7P+FIC}R#}=sIctm(o70qY; zW|u=nA8-uMXZ3Ph8mIjZm=2hQ^wrox@Prb8i%2bOWtlvxGlU)H-osR2& zRn;R@)r{7msvcqcTkQ>SE4BRyPlv7s*j`>Q_ZVXwG;IU$yr!T&PUeXKsW|~|0Z=i| zmdGal8n3MDuZI3Cl}&7jYGf1um*R@mmP+k*jHph@XMipn&Z>&!5??pE9rW9jlQSlT+R!y5mqrK7R|d#j-_FIzcF z*JyA5gu0tsi^JwMl$m=+Tg=paPjYY>tkDk5rDZ^|Os;(Zb`{frCWf{FX92F*Xa%$V zug5DWD`CZFmdsxLA|g8#wQW7vKiQ~;?T?BgiN#~>CV5Pl>?H;EkuGy8c}ipYxF#G3bDu{&@b?Tl(@ZZ52Sgtk@7vm=$7Lz+=PpK1 zjp?A{e;*nDivj6)*wH6RER|!RS)6J*IGsY7Bx*Lt=|gSt^-cWCL)wgW_bWw#t&whl0-I8=rCsqc6;QK% z2o1r<9e_#?M`9goH9A(S>*M9R{##DPMVBMWRI~BtAi6DiRe*J6zavt88s%psv^yt#vBuSt>i{?TCuk zq*^@N@MF{l<~kkA;Bhf(9aJ-H`57^Mn+Pwt@|;d{V$^UTI2CA;&dkN|=i<*TK#*qoLUl+S# zx-vuF2iR3M6AJh33V1ThO1ON2oPn~cL`#io!!~rk8YADFf{}4AGU&)S#jeOBF?-GBAgzr^ zm)k+}1b+CMkMTMsD|75R?a%kne`avYaL{}#>;taum#o6J5WrQ_&zs zy|pTJoKsOAqpq$>J;kZ$6r;Xhl{&_$*e6DH&=_jkF8jwi6+f z9J%9S#F4uY_nB*nGD0USRm><`hrP1v*lmYplrwvt%{kQe9^TW|4t-a0Gidj*50+R4 z_QCpixvsz2skl8>t1shJ)5od!yCt#@a?7jeVt;IRW7L*asRNvf^)c$es?_yK+ff3d!1%p{xnH2cjT;CDvz?=_i!ucIsX zmBWkIWE)kh7k-e38Fm>P`uo1WVFVX*rE6wdxuJ3De#mQ5t-=X@r92g`0CIp#@T+7S zWrlWMVDm-QHf`}Na{WG7(&IL=`<;b(9NEaW!XoNA7hyTIHnQ9(j0Hzn{L~M1+H@MtL8zmcHv z9#AZPKRL;^NWYm?+strL<(0r><%x=M;^d!8u%5Y=?1*oR2ey-yZ^1ktkdw8S1q=Lc z1Pd%!>>om~(1I=e#S~R!!AgGsL4@f76CI`pk-32dqp;;ljlz~I7=XJLIH^y;ne{-8hw)XA^$1mB!I@0X2X^rLv12#x$i-nSJXuJ zJSFQaI_nHVt4R2d!j>06fb?h-w)`GcE88zbB@ljm!=a%6J7LSq!OyVe)0uC#VatyJ zH40n)6@V~oIfGPVD5g(7_GHE>XHaP_>o#mTBSJ=|he=tK7-IYT0IEnD?Xlg5EvM`- zY&o59QBD}PoZ%%|&a=6YwA@u{6tmNOD;R|>XD~|Y)P^mmD=yn=!CsM z45q!L2Eg_S)l(F`EMe-w^e>evss66sC;U{1{mk}K~Z7Yavs5D z`?Db+3|r2C<=K8md}hLye};*t!!_Sj8Ls(Nhiks6GFsuhiwHc>uYqyvwY3FBVav6k zJq%l}naJBX+FR65Yi5c+20*RKb7u!S>W z%auNJw_(c}9U0+~T>l0xoQH|}QC<|bTpx6qu;mJ8!j>zX30to4?!%UI0sMEumaDvs zr7Rz>iPC3Xe;h}^Nk-x4T)#EpNfv(I^>4$b#yi#Uai1t%>xMyH6kg~0OSt!#V%wVu z>cXCl2X)c%|L4M%tNh)EEnh7CkqKL_{F$)j3h&-hmd?A0(*I7_a=zZ?_kz06KQoROIp9f!ZdD!7HaxfRpcR1_5v(#cNid+V5*z#=uW{k01?q@h_ z?RFxUFB0Itg|mI`7G>MWxhUA$5Of8ATHJ=@a=~D?h5`nlW)FpMCTuyiZ^M>rWy7%L z3WZ_IZ9{C>at?2_BWE2R0LhLDas8+KFl;%yQ6pn_V;ExSDCbkMcW01cs0i$Jz!HWn zXD=&zzmWYSvhTyd!^+-=>^5vU2Z6E=3E4GlIU^7&`zd6%Vaqv2Y}oR!l^V7@Y^7St zhON}FuzMo_BpU5YfIJck4fisFDdHFfy04(QQB*X4`2#%?h-`V%*5Yr{Lc{76m8z(-kghN5 zvV`Zh*h_#7!Gi-Tn497nTTmB_@3k_$c^iL7XP9Q=l3OH|<;g-!gVMU(uaK!5m}P1(Y&oZ%=Cqwbsy2l4 zP)UzyLxurSXt?Ysnl;y;F4_JBp>Yw)(Aah$Xes*%Ow6i-x>Q@rR$Iz`?*ywbNB>`1 z%H}6vp%%<4#mo!7F2Q9((7!pJmQG>~P^O5}tahboFbZ5Y^b7Yxe6~JEhQ`c}pZ__N z2{qvac1z20_#@hsDAXcnUOAvLg({px30a%gLdL`gEV20%B(r@M(eMV+jx#2_Xn5>Z zNW|Z}yziJ+6xzZZXZS2^+XrtXc$GO$lJ~9tjqtsMC&&i3RbRkgW#F-Zi)m-103xY)yzh-@cQ+WO5T2nO+_#iTz{3~D(hU_0giuJao5Fg_17!z zz8LOci+d)9+hlQX#c;J=(Y#;AaJ?D`}-{Zh;CP!s&m$H`wS<=9A91Wrs(=5zofRHOO!yhhhV9(ni)Kd=; zi5nc%QyvD&1=>dpFwDk=wAZZIa3S~5Yn?mNw zY1fuW+VkzV!(qer$_k=rxHw5a!{O5tcLZ)gFkJsq9~NXZK=z>?=hoKDFr7JplW)7&LnEa9mtgmzBJFP88|L~u%) zSXF%$;V7l8Q_{{7e5g+wO9G@EXbBA>f>Scm;`l1~P&3C_+@J_&>o>y^Mnwdte4fRz z#iwQPEf-rn8y|LeD{~DO=#FNoCA#lwNA*Ha8oCTr$Yk%xx&Hn^2!OTZEoI>FdPSs< zFnyfzhhpfh5xQi%MgNkiM|r2WGZNA;;Za?b4~wB&Wzgru(ETjBy;FWw41IV8{Y(r! z$)YXgrqp|8oH zACIB$v*>P4`9EUl=Q3z-lOul|4Vx{xyHnmIhWT-n)>7ztBKr;c!gT6Y;>-Rk?YB z#nl{PoJP`^<_WfDAz*!+mCNI-;UVyU;N0$QrS*|DAn^@~?6e5@Gr`d5VkEvqqVvn3 zcDVu2*h66zc?S}&GeKvk0f!;+BoYrYvDPNKQn4pk*`wKx5A!JcL!h0Jc$6--v~U$F z*_i23K~R#f2?&I&w%%wAgvzG~E-O&~Kf71-=wY>HIQ~ zU2>r7!vS^K3yHrlL8q`UkicGbZ>yz4kWU43M7J%a!BM5ta)E8YnFS#kM+bZsr*5Gw zhcVsGB5KgUqB(W>OdrZ$!hTVhW$4hl$~X$)tTDdMMmz*7bda-G{7V^?V| zfhNrAatub$XMTte{8fIW-^apWYY)w({!>G#Y~S;*MX9?nl$r*G@5WGS5p&_RzahS1 zD5YRzD5YRzD5YRzD5YRzD5YRzD5YRzD5YRzD5YRzD5YRzD5YRzDD@!f@0Lb}Qfe8r zhlWzqq=Av4)EI!YhY1a(P7pX_D8=CzH`l~_Y5)lO(ArOMgWP|EYqK?cvi9o5a{NMXCgKZID055ayMVgq1# zLS2izp3e)gxS`aMY_%FnO=9u^tn=BY2v!ZHB&mi{W61D(hEj(lSi~fq%-Ya4k`F}5X+_u?ZW3a@nK&Fnh% z6z`H6GUH2wMR0D;bma10Rwys0-(G;$Qv~i4Avi#uIBXg{!}{r>ej-j@eVGA|rb$ z?Z@5QQ&DzkPt_Y|Ehs0nr#e)?$ev26kv-MPLXGUHl)5{6svUJHxx(K8oqDUR<<4|} zDAek`AO{b!ynDC+@;10rAo}<0sg%A4_EervHAePSR9t9J)jF+hwf0mBM)p+0g&NsY zO%pJ(r@B?Z$e!wT0V8`V)kI`Z#kZ`+?5WD@5sd7qRL7A$mFE2;dn(WWna$!`nv3z0 zEDnIso=OEc{(oXm<@v8dQR(S4l&fWWK{{R^jj@@2sTq=aW~g8e#b>?aFvaG%-Xo>} zJ*mTWMb+WD!c-ZqD@>K)y231w>1l`S3VHuCP1XL12aC5te#YRiI+!wftm8dyzD6mu zToZe$Rrak|m18AxpH_63+>}fbR(?v*-n8e&52g zjNh5EKebWouqhhH?4Mcq65|(g)%;wfi!Ik=(!a3q0^?T@-fm&cy89{r7YkntH-UkG zcgjn(#rCTn>AuV7iNs}|%lg%nNuMaa)A--BHMJ}qo2qL`Ph0u}#@|Y~o~1uz{MM|0 zBiF~zTd_tz4^IWJ+-=G=x%64%pT||B!lhvaUfN{*J}B60ZQ(ht{}LCS4pu&F!TKfv zcXAsGKWx9~h39n@FFdjJ`Vj=Ln}r{>wq@NdywX)$ww~?*k{`BSV$0Uc!mqjhs%+%% zZQ&1GpFhaFzAhgG+0 zaP@^>GZShncA$mNPxxawv<6%Gvl9M~)aMYJe@?>x2irH)(l1H)=aTOPVc2qY!0ClI#==Vz{%X?4TKMLKpTl`@Y}o$^|5J{ii7t1HiPGf> zUreA+v-}Sw{GRNO)7>LQpDPpo1j;|t=HHyqsEcP=_=AMMH|wW<_wtgi_h=G1!#zpz zf1U_%ALN~9#V^PT4n8&mF3t*Y9~4oq1vnuC!dB}Ttm z{Ko8yMebNsBT@RMwKcoaeN*7g)^=>Mo5T`_wrBY_k^d@}1|P6x%knq$0erPPMc^N@ z{7XE**SI$dJTu!bJUBiZ97aM^=2|1IqK-0;dyn4Klq z+D5zrkols)HZ((bfP&soKK-1V~13UU^s zZOP?t2viKgXHoDHWXMZCz_FwCcrdKTF|79AJj_Gv6T$u}*>6C#TO=29Xyw#u3x-8n zvXe7~>{o_umO3sD>%rrle-g59z;sJ)wTf0lx$RnQjuskE)p!UM$V=|v4Ajiug_&Q%9w+(zoT#ib z$zB8O#mQedL6v>y^}>L#Oli!gH7YC5Z%vIQEXW@;%OD_ssQ0KFV0!Fz zg5y1=DKVKV1x}|1Q!+JRGRISc_91+bQ((B6ENqto+Ve>$Fx;*RrjXqMbbmqfw}7G- zDf%cNJpW95*5c`e=g(r2Ke7s>j)nWG)Qf;FlAQ|Yc!<3Q=>o%PE||jBD)ionnNwa# zwi?d@k-i%<+uJKab0^Q=fzSHSW89mx;q#;*A-)lQO+0Mti@jZu>^-^h&$OtpgBBG4 zTO>Og{t}4O(S$IChRVuY2ex-d0atev`>ZY< z5lr3vF#O!QD}aH^QO#@&zP-AG$MdP1BH0^qqK7?tGSUTx%ae8+<$?JEL36!SG#gTQ zJVC4CtC3b|TnUwl9(l;S0tnA%6ABC`V1}5HQ1}~x8$}>>!X-iTJfH$|fk-4d|KDzh zq~~|RXMy2bpnQDJ71AtD#Yz=(n}a+a|1ybE;OBgf)rDNjZ-*+G3k)Zg(Eq#Q~qx8{!e6O&>$?TO;w~m<8gS{A=-v8U;8&D&2sZ`nT{9)|gV>aQL?>;B+p> zICrMt7lOSvcnlA*vET@cFZotmc}@iw{p`~rE&&$DeZ4n7{UjpcI9XZQCrq5`xLL`r zfc`u82A;nh1txuTsQ6j)=s2~Kg-3qYDeGswh&3zqQ&q1Ipf@n@Wp5J-Qr!p^Sg<&C z2*E-Nwn#0e(nlO)~WHN4>g;ld|V&Y_>>iXAm?Fx!Oxm1$vv1n zD^xp9ZVsVGRXKj{w61_w4gfdyR9L|-LmmtXUf$*W+I* z99D=uo zz`IzXg51e`WG?8As^PXESN*IND$eb~P0}^WS(f`OOSo2{7P;%Fx|@`Ie`*HkA*u*RaJi53$Nmb=IK3@kr`g+rG1MmftWzGeS;fyA27N@-A+M*|ipc4`t^2m#Wgk)JjFd_2Dhl?ZTqa2V)mxjjhB z?Lk^@57Kgbke1tnbd}qKmf%Oe_h&HQ+t|uDX}LW}SGheH1FGK*{o2Cw%r*e^?7hGn zNw&wSXYU2>@(KDWdoPfS1s%&k>a`lEVp0|%+;ya^pSAW_aY_zalXd|ubNq#nzs$Sc zrR)^9U*4T=5A-9-NpTP6-R&MMpr5jS)=JGwoxm}ApUV>zmSg>_m0Fyt3%TASa!`U3 z+|+p-Hcz-;V-(bkCmyJ?39S)zvnYg6V|My^1mB2D)B7^En2E4%d8BWw_>>D#JD3 zR2i<(8;Nwd!m%0+$FF}Ku92U0iou1wLen3M7f02F)K)RfVhC2Ia;Tmr7VMC^kzk1( z>RnQ$92BL7a~AgksV}J7rV<*F{ZQ4mFp`l_q8Vtj`hpW|Ojh)(USkDLI=SVica~rs_kmH&p5d`EKemF8ssHWs-lfo3eh^ z`e0k?rslD$M@o0VZ`V!zlk4B%7GCD2X+8a{66XPvTs)(Su8 zrmUZ}!q2-Y>u1f!J^idx?{g)YY!qIH`msGzto)bV)KM(|Ea_SLS*PS~-~vm3(@n`) z`7B$%jc!WL$}hC=W;Z2g<+CmPft!-E@;Mg%1nrf_wUz(5o07-YLQCJ~rsQmVk-19x z;|Dh-XX95{{>6#Z-`RgxTlm^UO3ucwwfUDOQgSxF#M~zNZ%)+XqwfYwUJDQpzYu&m zQIC(m5PS_F9)KbEW+EkL<2TvN8xyG_u8B9BAJHZBvrfs`_$`+HNg_qleeZUY3pV;$ zr{paB4%1!W9}=mHD?q=~oG9?jtdv&-_%3smz;m)v*3X(}t{9tHDLKo&$Mh6g2^+y6P&q`fGUEgm$7xi^|M|gU_t5~J}AF)m0FBtlFMLp)P4)bSWWI{IE(FeqUIS$ z^WVar&)uSIBRLlZTN{EF0I1DvNKGyn?AB1g06Y^O4&juOW8X+b?dQ@UKiNjByg$$SKESI^|Mx}0ZOO*93F}0CA+d4bMMEJn(S5qRdGwKe%1#I z#AD~WV96=KRLe{DWiKmxzmQ%1tS^Yz`;y)IS#uC5`;d@b{j9Hx*e8*l`>!s^vpGg` z8EG*&J#3}=S%SwJ`K`!GyCub^DoI4mRRPurg@QEi%E`!GhrJ}P8aKWnND`?lN%q1fbD)i!^< z?ZeF0&zgf;GfxaNtDki%sT#FClk9ac84HqAIp&r9v;&0!_D~!HrysBE+UwI)6wA5? z89bi@tAK~bc~E7c92!dsi^k(_F>tyKW=e)#Qhz~KhVVf+tm9UteqC$=AdiG1!@Z1P z>T`?&-A~Y5P87XJ(T4-!`KRNvHg{h|hSjTIrlQV9x`C{_oMa*PQl#_kx$iwld;Wv? zY$)fx`S#p*jo@D-Ue0|R$X1veyG*6(chD-l3Ty+zAD!Ik#pry}*XIX{_(qtP1K|E| zH%tW}H83}UmAk?i6Z=;rWj-LYr?9U8J9mwL$UZ^XSx;^wm7Qf}WY%Xn5PXerva;M^ zDkqEiE$7pq2RQ4^!*EQ?S#Mg-ded^&o33)!%j=0E!J1;BE%J$Z(!zGOGe2 zR>*oD^h9$^gyiu&R)!@SCQFgw4AX2}a_dWFd9o1GptP>$He~7!W|G=p)t z=>(gT-i)1iR{91^qU`ic^qQAG1)s@uUGVtnm7u25d*SI+BYiivYB}lI$d#Mk$cImw zC;GM0laQ{Rz8OnHUV0p;b3uzVU_0U7>^p9xK-s!{f z*(N;(c`MVuAXnS;-gs!VOTUZyv`-HJwL^Lp_&cV5Mm;;Fzk`I%>3LYRyQFvGvuk=W zc)F!Gp_K0FPMAAA(odkhJ=0r3?UkN@T)opXkzVPf84u%0C;bS%o^sN6Ai z+DSLV*V9gVAGGcnC;d69vIZ9|Xy3C=dLp3bob(#h@_8ryB0BR0Cw&N{ti^!>l=vci z{?XQTPI@F*UUJd}Xv51+ns?mmopd+Ie8oxY8;R1(QODPu^Z}^S>rQ$b`socPeLhOx z;G{2vmfm#IrvUj6R2R@&PI?e3@wSt`11uYz^k9g72TK5;O-_0OXzx1dAEBYmPWl>@ z_nwnJ5LJ5LN%uvqw>ar{!SaEVZV#CsI_Zrl{UaxR1WNzdNq-3F6DPeBw5?A1DrET7 zNk4|K&z$t*kn*{cEZ%O4?{0(bJ9r^yWL59DE4b7?V=;Tanc>2 zo^PG>C*a)Sq>lmg9mXJJe($8!&pJ)JzaNnu9q>;lJsJi5ksDQQMh8cyAab+ZkKN3Be`r8gTgle|LvqKBFF<$ zbNd4T{XfA)N8;!Tcp|{2ITfJF+2BTi%_bZ>(SpIza7^ z;t?VfZeD4sxxkFJ0?+?M8@&j0b0JLWwGRu}hl`Fury1cN0InSbJ9A(alJU?n06&2~ zjl{=!kl<;g7V&9TXDqt(VuDTPfq4?ZW*F-w6m%nL2MhtNv^BtI05+d*>vI&C*}tb_ z5g%{sHYtPac$&pEMSog8bm+z4s6806umi{H)WQ6XB_C<#S?&+*ckOX#WhabEZRL?{ z<&nT?#gAmg9|2hYh~?)n@W9TJrr;Boju>94gi{lo_-kQCvZkFv`7&<6%qvQAw^eRN ze^qV`3f;lH!1|qNw%Kw9Z50Nm@L1IE>!^MwvVO+`r+Pk-%3DoP^n4Pl+vzw|w~@`x z>aO_R>JCSBS?TG>85a6Sl^)JYBNM)cVM3TSTm{aSHDjnPc((oK)M<`cUivoMcQ)(0 z3>8F&+(N`cGtV-vw%>alj|Shx9I|vQWP`^7rvesIz*7XJ!3){oTDSx&zuji1s{Vr9 zs`3#|r%Q3{FW~N6z?X_HE}w{Dyu%7Eg)AL3PLJ|WwGh))k*LfePS5>p(U!~U zWqzSvXBacuQr@!PRB94-f?Bs3Qn%+&SdY^zgSk8=xcAi|mTJ9SC?iaJr}yn~{8JX+ z!Rh@-9RHTZcXWEMiR1Z3A{qWpr?6VmZ8FFmr_XV$`x;}4n>bEi(cv1Zu-_Hz_7{l7 z)6`_cI~9Mb4yWJg%=BVM5OW>lCbF`{^-dG?%(=3aiqf`yB&Tzu8lH{NvfEw}!4*=@Jq zcmD$q{_XD%J^aX1t5!e#%$jGPd;XPIUwi$H4R8MAt@qyF^1+86ef-JRPq%;l&9^(g z`~HU?|Jko6$K02H3Y+3)WhJtbY>IKG_3O^2Y#Ym_P-%6tvYWK^>h>L$Jm%D(q}_Rb zy5Ia8?tL;<+J5-9dSfQ9uaRHY;k~BY*&1ogp0(xt|5uHP+7dOzsm<$9Ii_Ma%P*fC zJbIB9N+u;d>>%N}!Kpnc;$fpq(=0TOsciMg&9F^sihwA4eWKx8OIM+V_jW%ta-ZN~s%W6GWd2~U&)Ka24$g?_8 zV`YNFXB3A|8`mtgTqWP468NiwcNv&VTZF@>jmu@L&Sb3g5_PDp?5D3H{5MX#b^`Ap zEME2PWpmzZ3SJAr?b_(=DmAYRyc1o9xvAiG?ISQ$aLd+cDiYkb9m)i^ZkI8^?b|a< za0~Y{68-xit8Cobon|1j4W%!((qFdU<`nlSu|~Z zs@tIHA4&d{l6TE1l8b5Pq;)Q^5(kEor@C_?S+p_X?lu6Y8825RUG~hkp&44%X=?-`SpS=gH6wHJ8bSiGc=MfYj z`Ip-KOPT*jm&Ue|-!+nSYeKf0$p(*ZlGFT`7MZ^S5FBf3^9` zzd_ybXa3|~_D3>|$Vik zRltgOYVsElt^Va1+S}Q02$!sV?*k_DlchEnyZ!dzayVqIQtZzYp$yyr8L3-nF=oub zvk2U(z#ub=nHF$Z8vdNF&t(1E`Ee;eoc+ZN(|bE%_$%8qC5s&NA0XzR-dhR7A7@69 z&XL$sy3VPXqSkbBEw(*lA*a%IcHf^U6-S1ZV5~NsgeKr8T5URs%iL12RYJl=_@VPj+u8QSVr zn@&PE)uxlxrjymClRrEE+H^8+lIh48J#{CYHU`#LbmO2m2wx9xx|0Bp$=p%2dFV+) zX}5HA?oWhz@lew(9hdt#p}q=@&;1*rehN)+YSP~NPzaGbkCcX6P|Qo@JaS zBW?B)y;yP@T}k?hW}d~rWxvb7Y)*m6VdDv`+lj1k-q{de0;@H1BHMfv!E#bhV#AgZ z98YNieh090@+s5sW*SoaO^5O1S}Q!jEs9p41lLV7kRFCxt`alcopNr88EM*~E z^I7+w2=2wET)?M8`*Q&fWK%96^GN`kZeUYpN$1YDYWy?R_&kWkt4W;AhV`C_cG93q zpr-*9&m(aTa}GL>ATENiXIG4@On!oH^xN(Y&Tk|I^2Ya{q z2-{==O_o?7%s0a3!+jpKmo@((`r9|^z=k|+mRsg0e$WDQ&WF-!!}v^<_B53?>H;)e zl=cjj_9#J7+B4L{w**CLYuK8DX8{zYJxirsOi+~eESXmURHZ#vMQJZkX+MFeN?S{% zjk?e(O`vZ86}QLDrg@RXaet=LsKa#>bS=OZlWZIAwcn4T>vVLz!z^Ebr)-&}>FC1k zC{@ySiqk-b6jV9-dsPHg+3a!)d;v)@buMK$SWPy`w-Q4-x=H9Gv*#~3cL5IT%coJ* zHDTvE4*tgn~jeB5#}fQ(uQ7A0rw)~>|KHhj2tvUoC~;(RH~0u>T|%A ztW002%)q%IOEvmQHO>XxmV@QCA601%?mW#QW;u#!*AVy@z|ejukR8ea?RBwnI&?&0 zFcW=|xSELrkyy{fp-AjtVhj?k5Ujq#L?nhF(QK0~fN!XwqPY+-gio_O{;4HjT9ttA z$)0~L)nE3a<>;&HNpgxK(@5qMIttmFeQtI2(yl@fg=dn}Y?>|nld5E=$<3CaHNqu! z{EE5bSr8pwF?TXYpnH>NV-T<&y5;1cjHLwRV1^}X>_U3i%V_80Qan7IF1X>g*UPu< z?a1}=(4UZ(e?BY(@b^SJF#ca&FDKig7H?+NHq{aRt0Vd|?9TsPME}DvC9-e99CUs+ zxc_KOzbe7~PZfkjaGe1Y4{z}Kf;bMJHaZVI&m_42O-R(d6eUE_dF~coM*p|bd7cmi z85zs}Gkn`v{!C))Xk+=yy9AVKT z8_S<6`d6|1*=aU9&vDcyqVv?mvnHoXbecDF$ z49L@Nl90__L(Rl)i&J##?rZO$gdim z$G6dWw8wTIwV$%XsQrEFNI7BD{=)=}qV_8_irPO>s8Q5@rS2|j|95$myr)t7r$Y4a zMeSGm9!2e^8l$NFR9qOff4gm~jn1QB6tzFUuIe<&$zPV}E?^Y3|3m?!sQp(77)9+@ zO+-=qR|&O?Z=>^kAz&1>Uv(Ts?bp129JPNldM%3D&jAod?N5S^!kV7lQmKZ?$?t!6k}^G%iEns2HM*L+iDxJJ==bhzf5D#JC3&g0wY zJcICa4zUz8YJaf}TW_QGH?d#`ziM!eq&7o56c;80nIZD7uzKzbqm5W!* z8i{_OVUQL^=g~;?gDkw#Xyo_<&G|y#Y&3HGU<+?E8aaN5g=ZqNJOsz0^Y}J8&*hST zvFqFDJo;c;Y9rN;l1;se$M`8rgobh1a2e zT+gT2_Py--HaZV`meF~98=XhXf78`S_L=BB8p%Erokt_tXQK0HB>PNs9*tx_*S<;N zb5|qRXQK0H!RkG?SA&RT#~ zqVuHr_zS78CDK)+^JwJyOmrTNTz|9C$n}V#ze{u;jZ}ZT$-`+Kqw{E_`a4W-fqzK& z{QZmQJd7@g5Q#Q&{at2>z;kS5`nyeCJR=yLMuI5(uAjQLv28vlu`vZbNdp zV6a<50RylIuCnU+53g;8l8vXAe5bfbZgk? zJRAhdJ|tw<=sY(@>{H3U9BM>#9*&V5jm{IcQls;Pt^5hvOr8_AQls-IRFI?5c@!$n z(daz0@qot@B}b$4Tqh8t^W4NjZFC+EM6Kf?n%T+G=sb)Su1zWcON}*nC?h%#$EmW9 z3fVO}&zH)s!QIEIwiz*JKW4Vkc{r#w^TaT-M(1fGRbzCXS!B1-c{t{k{j{ON;N)m@ zo|BYadwrUUVp;bigXeQ#?ZxOkX$<57iOwS_EE&v>#Nfu(~ zBVEr%=eZwg1dzgKgXhs2Q_n`{c|q{&iI?a+^~C{!8@o)UiaKZ&HUL}S@JAy)L5jq%j-=iOv&9be=$>^8{6*^Ds_Iq2bJwo+x4- z6xJADg=ScUW(A7`w5sEm=XVk|PJGQ>m92=c^{bL=6gai-Ir}vanIP&?5yc4?6D0zq z$G9khi)&$_;XKP^Rs}??;Nog$qx1ZVq~~X2vJ@K5FwMp#w@50>lZBWDrFFUAB2#ZL z%hX6AC#Rm~w4Fh!HiYv~Nl$1)4h5pnaM@8bYhE;1tADD{xCmuvY&#Hj5uN7?TxkSN z0XPBANK7Enc>;;f6G(KPK%(;m5}hZI=sZDPw8al3I!_?cc>;;f6R=lu1BuQPNOYb+ zqVoh2ohOj!Jb^^#2_!mCAkldOiOv&9be=$>^8^x|Cy?kofkfvCBsxzZ(Rl)i&J##< zo;;f6G(KPK%(;m5}hZI=sdyxc)GR>BsxzZ(Rl)i z&J##;~j6KHgvK%?^n8l5N5=sbZ&=Ls}APoU9x z0*%fSXmp-Hqw@qBohQ)fJb^~%2{bxSpwW2(jm{Hjbe=$?^8^~5C(!6Tfkx*EG&)b9 z(Rl)m&J$>Ko;~j6KHgvK%?^nN8qXVu@h)?o;~j6KHgvK%?^n8l5N5=sbZ&=Ls}APoU9x0*%fSXmp-H zqw@qBohQ)fJb^~%2{bxSpwW2(8=WVyt_`M6rynqvJbx!X3r!(zi*&+eCO&7sQ+t`| zaUzIynl@_&6quSCHX&CY>ggOph?( zEy!?t8^RzH{ZWS!xp*7F=Qg5LlzvI>v(0GB^_l&ih1(_*po(R}em2>kyc8FQa{oD< z>vGM@0FGt$>8yHxf^y+GgVb{f&S2YTkor8prrb}Na~DD@`G3J>7BAFhvd&!rHI@6c z^VpS>2wo-E&(zdQ1h1r8&zJ6W8ga#MX?Tj|xhmi&*Fb1n+8w>{qgsF9%<4J+To4y+{b^>G5maMYSt^wE#ahU|zN#Jw~lq>+_bmqH; z$~=PLfCxN?pbQ*&G1G$t4H|2faPWLVa5e{yq;CRj&CNJ2(aa?Xwrb6MN`hw zrXbzc>NTKJxWHYIb%xXE`ikcOJ`C21$C3DkiTjb*XAwdtZAON@-vu-s(B7XSaXk|| zka&s-2V-s<6FEqvuaqmf(t&LBW;4(B&zPNB_!%IZk8s(kgLJbFQthS9?4|T#yf#F7 z={@$68CD{Fq`+|Pk}d3#!C+L4eL#)PA}A{Qkl-?cqN0yPMFd4f0(Q9y;C$BbV~RQw zU>mAvnXT>5_S<|>K{Z_tx+v%!Ca9n^){ItEkQr9FYbH_EfnX3-ox%iFbvYAM)uT*M zRhyB(U)w_VGvcaDvN{^~E76WK<{Id#CoWOj$qdals;u@hq_gF~YRI+5X(!t9WYcVh zwG(w&Xm|%1!oJ*T&jxP?8N&)cPFRLqN{&C?CoCGQA+Wau@B^${4x%C91vG@$W#C1G zMW;%CkFY2;SIWz}&Nv;Z)p@pE8|}BLYecQx!60h=GZR$nV@QN*-8Gk}bq5$ktp(Rx zwRUHMYCV<-s`Vly@YnVgPJy;it5xT-uHc=VrBEva6}K0)wiUHDz5)05qS&^g*uw~m zV%v#g=MfgwD!d7>Dz}4LFWd-Nl&kQugxhh1brfY@L|ByDN#Oeli*h@Qaz7(1%2jys zO@I?rw!%LVz9a+Bx*4!2U+Fb(0sK1YUF5Bw`w*_f@)fSU4e&B*MByXu1UxdszYMT+ z)*`E|ZT1`X64F^;fk8TJpSx^lox=p@z}rYv?wU`!tL@#kyGAgEJC z)*hN`zZ*S-o?3{2HM*l%!{zD`;B<9g!`0n;ID7^_%hi22LFpy|uLIbHE$Lw;UTD9~ zx>F!l#^I;nX~li9f-ULV z+!nX8l#v-20d5!rG%#MAM1f!c2&bDFjkUvUGG?A-53NvUL5jH*d39mgBqMd&W9Ti} z7Hu{QQFz_QZN#znr1Oph*g@8v_hleIMEC;gcZ;00q@MtMJUjaX;lH2osti1JCE#Z` zIFw%dNx+ksU*Y+Hd)#X)dYrb)hQVWCJJ(<4^hhMNAJ2-&PR~0m&Mb^{A<^(Eo#tCC zi953?P+PAJ_(<7TYxPoFAbqt~?~E;w{%YsLHkJ~QPiy=VMqCQlnS)Pj>a!nIJys}M zxz)Ax`-m=JtTy!-1l45TzU40=7`=VV$Lbe*`

    snOfFeEasT2k~RWEgkK1TZp%B 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≷8 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%0A5P)?XN-CvXu@$mod2AO*JucCbKTCn!o;^Tp*9~N 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≶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 WC;uwx&A}j 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 z z_HTlvsT$DUlHNp9@iX1eI6>?$T0J?K<&Xq3#mV1kmcRlaq+)qFMegr?82V*rT=)4W z7KJiJ^X>^K1orkeUp~`(vR`xo^(G5UU|s^ za}z9vjk!7iYZfroawV2B0!JK&#&&;6OhS%$!Ay5XC;hV-+?L+?^5+QXUNMp2&Ar%s zlDk|oPkZXaJ8=02_kcoRx1(`>30vD(V>kV^vm2LcLf7O43fj$mo+BgbrzCnIPxx^? zXm_uv>w-~N7-xs7#FH<3J;3NsQ>6UXnI3{l+(oQh^Ff?V4jC#@d?AJFvuMN*=kf_h$6{*$8MLzOtM6L(+2bAi;rQHtC)nvvm#+A zUT#fO2xA!Qbw4R^QV4aWIKc0+KN5h4rTBBc{+y>jO=PbX65|#?F;KP~wS#OL zo8dO{q)+B>3!pH`rg8bsZqX<9vEu|X5ST1obr0OM^Q2l9$30)Rg8jQoBG{ql#Ro1u z*gy)ati+7aZmD?^2Dt;pPXe3UIk-M4C7c9b`|K99OC-_-^xg8wez63c8%uz0FDvM9 zIK-f{WvQuM_+VhTMatVOj>2#ruFQ4t{IZqA_}qs=jDJKo?|rht)4jj-(N`^5!UpwN zb8a7$1XR91k61(6c zN@xLd)-eT+@%g3cIX-z3zlVlLF+%oXye5N9911@+h-npmA7zRY;iuhG__1}Th96t;F8Hz7$*kSNZ#X+a@*v5w zIb<7zn5M1KN)@K;<^xj3so+OG!$QVLl16b>h@-tw3OonXVQsMpcpnM{%4_lOC6oLY zDRAk}ECqIXJY#z|L(7irQu*~Zfdzp?=yA%Tj}9a5mn2w*@kgIkWH_$4FsO+n#L=?o zZ;_tlcVf^K$)PAVgmf7&b1*7fd{bF=26=^6ryD$^OskKAyZub1#>MnPr?Pga6*5Mr zO3ia2ac~2}tLVp`l6wJvr-dW%3>66S7?zL+Us?iK$#8}qEd$9)G|$X6@y%A zpig-8tGrO{Jr3gPIw`@nTXI!3Oe^+ieWXkvjRQh%-`) ztY&2j?~iK5RB`g+o;JI6p>2)+==fnrjB#qAOh?mB;TLGGdKZj#nlNh_L`H4x#K8)I z6r;#;KKalF2~h56>(_x+FxV$X^;P3tl9UY4)OWEt8lDm+-p@#`lzdgp{56au4(xE3 z9#>gl9TLVtu^*Cvy&l*xkQ5yMRpKibhlI;8qL{nk$1u{C9;EBV3Jw~_ooF>lir{EK zcUAlhNRh7MB7+u7B<@?w4|nSb36{aWE7j^Ft>o1#l!KirO(i-4wMmNM)JKdV4%bN7 zR&kWqH*iom1GGvgeeMiM{$+dCEb(k6IS7km9~r@V=&;S?M6XMZuZY8mfyBWUzae2F zSaJ~p z>`l3Ry69depPR*DghH)}V4NkPtQZ=r;%6c31;>M&hhS6$9mQNsWCh4OB-gjZAsG=r zh?ZZFFm{ZemTHKWc3ONPaVqYzBq9}4b-G2Q=G*t^ z99wgfWMSv{$quoH#CbwxwIrcL)hs?(_mrO&afn8^0VjSJ6`(i7gv!RO3~a4>n$^tB zfyHivq$62wWDXUVZFq_sS~lLSK(UjZ29mtk2sT#?-+jCTCaQ4B`{!xir9cuG&BUu_ zc+f}CW5h}5L3kylX5xtAgUTB8lN@ofC@F@L5V-~EgVl26h|+{XjU*o@4hfLu?~+gE z;JA~=l7Lu1t;7i_dI-mV|PQbH&HD zuupEoSvmPEyFj?!B8l0B?St7^6-k3#SSu0lrwdD9maqdF3C9e0sSJ)#F!qCe-Z__H zH&=?m#3esZh(l`a6dx;Oi%DAS7Q4!>@RLJAn6a^sOE%(cN=#9#B>*-^q+RTAh+OW^ z0c5Y}Q#6Gd*V-=T@e}e<@z;yPj5mvq$=x+22>g+@9hw z6Z5f%`7*3V{YU^hdMeI@!5OWraSr(yAweh-o^0nbX#_EksQYdCB-Y>%Mf|LS_-LUt zOG2@YC_nUb2EaDGSzF1dT;_|3pM%9}=F2A`?$%0pYtdR41BgATH9`xEnvwg|O!r3!}(i;wQV~-PE7K9@lA;~K-Q7hC=HMRR;(WOf;V+sBW2-p3fYp&E z-&E-BO>L*A*_Q{Lt(#OG*jrLnfTXmx9BQmB$c3d7sQCp8_fMIW?W`zlXquE=SDJH2 zzJGH~X}A;vQ|K>@l^_14HJAG(=^W{ge3#6h*t}aJx(8z!LG+m|VMH^_mY9)wn1~e3 zFeXRyC4;$8iOV8}%DzUWbmrjrSb@TvAhEM(rorhP%ThzWL&;~agmWCT#n&tjQHYKe zxF~iEMKUYnap;-w3oQQJHvTAbaAG3OuVrXzgM__O)oPMfuf)>F7T~yv$yGijfXQ(g z`DuyD6NhlxBtABdNm!Ykq8YG~CCySapBUj+Nyyv=B|xALj7anCj~ZA9z*WXec9nIO zY=VIclc>xugT@~e1>?RfY?t6{3D#ble0U=3+{jq$LITW)YMfCx1zT8nC(<`<(%x|^ zaTOA;i{ha4KnY*oY|vadIs-_RhtEJ^PIPwRJ#%3#ywLCW7xwxKV0FM( zPzW@iRI$9au(z?gAW*dX!JPegQVthM*MypJB`gF^*#;TxNx3NtjK(wH=i}lPo<}%0 zG#wKK(B*|Xe?ww}X&NYoXLruj*1E~JC;WAjpPDj1{Iz+du?FZsDK^5i0U`3sv?KDn zU7W4rko-1_j~JsIBf-Jt9K)z@OFUsvBtD|SHt|^|$Xpyn&9B=4%s_`3IK$>huI~)V z%6LvJWDZQpLWuB0EPir?iJy#MI(uBeiir@Gg4_|_Ej29{r$QV~h+GA+Bw`YiutjX! z*CZYB)1Fk=%`|c-ViFr`4?-B4+P|`f)>Wvs{MlTfbh1Y00n1!5JfKm2i@cJERW52n#DA82*Iy7F<0(zYFskE*F3(ChiVTFE0v|$*q7m9(o22 z*ZJCKz?5ky4?f(Z!h2yp(dS(fij9RTD&ld40GvEzmd54&Xgw~BT^kb7TU^0^7$(5G z8ORn07tAj&r&a!@(9#L>3Xe8tw-?OEq{fToxN8!x6&u-gp+)-_hwB^a{RNLq#UxNy z4So+!9{>Hc=0-5Lj6hx>&)-lt6{hwlcYbZ&qFBS*mS(;*sIW_#Az!##pzuR+h-4g& zg@d1DY2`^P`HLdLP84aQ2%SSO|No_1amcF~Y9K zHM^aolpU+^dA2sEhUu)ROMIUx8I?42_bDYzjMB1{l8E@kM#9MTF=9O{*L9;7r8|N# z2`A$svtceP_5NC-xGo^Jb0oD{O#>3eYFw#>K9{HnfOioU=~V3;nW-UD01AN_BD?|M z>xT*Yea^(rO(oHJ;SDg!z9Lv$l!ce}ren@1l6x>PPuJp;n0i>u^KZ$URhFN<4&uhW zg_uS*6gY>I{(#?~JINck6n3DX9XCAmOk-`pxw3HSY?@TStpneB=sgGK%)y+$VFO+k zEX2i3AFk=F2nWNn!afB+#Sa6B!}lOGZB8PCt@l82Ba_L93d zO4xjHQd<#vFiZsG(4>%G(VPf-E7R+sv%FgvFl3i*i3AW~Ir3~7DZz?7ET%~kF+UxS zJAGD|qMvPGR(6CL_ew^^0lPc*1~X4B;;fXY+^j&2G;(kZH`5EG&{x zw0ojJW)`J~2}CW{%^Gz8?Rcn$A;C&ACbu9OHn9Xf-E;?*KBna8-ac6UX7O>1_A%p^ zF%OD@&~R*j;l6zxUR$~VWPVFHSOh(hXl(OxSy$k(LKtP2`47`#B!+jJ%BRT!rMe66 zREA*TfVcJPL%4Yy#w&E^MEqD7()K3a=)qdJ7IU8;&!J>jRJ51QO=9ZX3KPte4!7en zAPRJFF*y>PTvFTkV9oxS50_vGijc10)L21npiWjjiO|g8%3uOI|Buyv335ts(&5^I z!cP@`YHLk!($~ttbEZIY949Zj!E^=be21m;ca+XINq4u4bFVo6APxaU+9t5eC9GN; zj<$=xguB8^HyTn?o?>HEvVaNlM@1jzB?dB*b)-^M>!9nb$ywEzI?L(cZ$!Fgp!b+ zOFbyzKM-fDIPBoy7654xQj^3GfGTb)YHBHp@6@|go?9b{Ntkv=nD8JKvF~JhbXG}9 z5(aywWe^fpY-J72l8S3o5)umjr$Ua;`<~Dwe#aU#<_1o zvUA6MRWl~tE;C(Yge!GfWjEr5tl^>Mm@txiW-zWx;;gHiR$U&az$;qvdIFxe>he$C+*>*~j1|=zFmyiv{Wy}v zeU>c#w~_^cbB92IkSElLKLjUPQtlwon3z<;(NL9F-L_^*jwbOK+Pjj=&Y>)j%P@`| z3&b`WQ`GT?nTUx1j)W6)mklXHGbxeTgv`ls7Ry?gk3$KWL$Y&liS4X|7y+0`6uDxP z_()6y0J%7wi4sAd-P$3IFo1l68NVlqz^dfO#bwrcr$&+32~1{iW=ZfL#L=>KZd%O5 zIxVpa?AB%p<&cmBQb)`7?Ac1kx=EdSbu0Cz7W+=FMqs#wD9!594c35I@3{myR_pS$ zVX#s*@Qd=vCb10+qmPBNr!b!_iBw^Dop@8M&K^n)?~*|FA9%_HCpKQOg=GVInc!UJ zAw3cdy%I_|#>BUhiT)0R`u8N%F5C>i;8=8rGjT^SIivH9hG5aba8V=3eCFmHzdw+G ztQs!LuLsGQc%^LRR%gN;3!NW;6)q>JXm+$BC_6vdw4DVUJr!TNrRu9xsL&-R z*)M62^oTi$Np;30*;*1dBiSl!%1HtejS{M!t}c*J_E%wIuPUZs!c5yF%_5esKw>GZ zgu}$q+$Hf^v5LAoPn2%&&i(pn;{HY@sB{{M=W}#)Fc&MI54qrLnCNz#iH|u2Kmg#$v@ZBsKl1#jFxCn7$++kZf*NJV!!_ zM=GWaA*v@OibR3gLHz6z8%f_YrwC&#A*mhK>-~o$CDDg{GR>TjIf%O@ihPY_k~>V1 zFbixB0ymtlOZtW3Z90?XoU+NyBuD4R>TKdJdat!RuwoM8n z>={M6Vp|wS93sln;b<}4O37BmhD^a0pIidO?LS-s?9szXJhmKR>~QZyk9fW-jtd%g zkuW2q7{SkzSPWyyx7Yw37QN}NL#O*b8>MuP2qB z1<3$b{lw3)BUA_wme0o1XXg>9G)h|MEtan=fO*K4D3y?S)=NCu+0VuIc_z1#d~+qg z^uUu@u&XLTEXXdgNPP@=QKB|5iwZz4$`e=ETH<{(6DcZ_LKY7RAip6f4ofIo$wVC7 z90_xMTji5sWSsw7KACs_pbxiHa9M!JU4}#Re1IcZYHisM%2KQ*V!#Cd`=wt*nW~IDUGavuqk6tl)CLE z5Q&T9k|H{lG?~*KFKjAGUS$b-L0d=1zCo?>t>yEq%hEc_SBy>(wX%h)mBg3uE6Rr1 zS$-sAniynFF4!jXT?#B*IojCjlq9T-Jti8@moPS-jxvCck^x}BD3MFWA^wr}Va7`W ztQ<}>V{=JQSf4RcHw+o6C0aSSmaS(^`Z&@eNv;=I7K@h+p(ZvJ_SPFw=1HRB88Rt2#tv z*&$_<0GOCzmLb{Mj(mg&9|$*d;41vEO?o>d)@x>8Hhl zRhuVux$zVvI8xfpIrstb5pG+=w@DnLL2AafbKE&ZErQ2x&l2LPR4OKsFqoSl%#y-V zgql#q)x~!%W9;#$y(*xRILX2-f{4daASUyZjzhF(dpM!Ul_eHx-}_R58P}I2uv8q9 z2$77KSu0`t2V=L1kK}LJ?`#Pel$J<2tdesdGt-A_P)s=FRw4njhoL(6v8Y25!0OAz z$3`c`w@V!MnB~)_y))hW%Os`8r2-Nz@sjjO^4l&E{3Mm1V!~m5GAee4jpBqu zQe;4qCZ)WBO+PZ7CY&^C;{!_q;x`p-X54Ufb^f5a^L^OX}ldg+Pvhd(a0ry+#R2D66~Llip#|56vyR~91k)% z_KLlwkAqByY>Yn2P`1&W52~dwq81LE#cx$aI4tb(sgQ^fibS}OzeeE~;7Z8l$xOsb z$W`g%K$Eq~*)|RYCUu#^X>uWal6UUNa{rtywIwqO#B$BYL}d;~<2`6*ax^evF9 zz9ZXkY5?giFmT10&L%f>(DK0GC=*8yak>|DJ6 zjmH^|dFNj04?I}Dpg6c=hM0}>RpjU9P2%-vIXO)DCc&U%SJIzXG8IHWxiCjU>qCjA zx@bYo*2&oQEp06g7HmV#=1JKFxy^NT{wc42r4hOzp~A0CFU(qbQ0~UmMDPxUj?yb> z12QU`#Nj-4ulW8!9P&~!M{+fCS~5(sQO;rHv}BR{BnQl#^2c7?{J-WN3uhm8-OjP( z^$zj*2h!uM;!I)R?e3t}Ki6Fb0*oYJ&u_Gt|6%u5UTZyOzTgq<#dGk;K&3fH(N(T3 zFAg;UY0EYji*m>;JWQ1tn3OwXY7T^&0OqhezExa1`3nt`|EzHH}~=M^D2Y2Pgn{h>HSLrP2w2R|usaGK>>hC&%7L6xWea>rO8)gq2P zL;&5pL3)9Tm^qti{_neEycx3nogR^-ASxxgAoX}>UJ84Rim;uXMWUTDJ0FYvsrX+I zp3+`dQZud*3QWOC)2Gz7K;!A}K(Ld6qLyn;Q>OWR8UaZh<(3K8GsMvq0!w0MR3T5X zQia7KnoJWUk}UKunoNKM33#u-WVJXy6^C=nqvAV5noRAmVtS}M7hLQPjnxu~{=Ad%C>Eon8L}3`|&8|S)MU0|{E?x1cJp24d7P72R^T`^dgL%HL z`q(`1qC-UNmN+6O=W(`ICm_4#(QDaEVedZMooc2}8Jp5n?4#Wc$(DkN=1j-}xPIj) z8^FO+SJxKjn9Q9Yvu5>R)w$yy6Ww)G{u=AmMge>aFbNTQRXMdf@s0kGUIAV!p)s# zwn{G~u(f*`@aJaSVJ~#PU!l%7=)oJs8v>jiZj;77E)J1@q4+2t)`*Y$0Mo@sK*(#K z)ryj132K6m(+P)StfVBq5oB5NNw^UknV1o*it?zAw_bPTW)q=VD;XQbVMZ5k*%XH9 z(8ogZ%sEb3zRi7!LhMWUgE6}?Q5Q#_Jf1N$`}dQyH28ma{&{dcVyg@PJz0tRx-3}! z%8D&pmerJV+mhRE8M~%xU7~4hY+WMjmdxy|s&&iOB$ls8V@mt+?v$UZir1fzBrR=K z)dyySbJYp&1D?(X;L_Q!z>Ghbx$unH^D0>52D6rLS9tJ9P#=Kl=@w@*UJ&Sq!Sngi zXmn!*tfa&IKQ#E7B1I+BMAZ*>y78WTXs*}@t_W|cn7-t*!Sa?s5fq-v78aG}M`wl0 z=2dJjo`#18Aa2YmS{R+N6Qy-V@5YOiedg>+^L(0jyhlb4FI*^tQR9(zksXz&XBn>- zpUq_|sMHd*7+o&WoQTN#$uEZNS?b9P1DKo}e|9_XuOur&iDC4a%gDX;g(ck;B@U7q zk)DZ{l}p((y<^E1635w>)XhufLqujWMwS7{ zGp9ZARf(5PsE}|?qt};?N`P}UT@u;5{iYO`fp3Em>EE@|W+7f>L~=!e1u^laSEg6J z5e63E(VMMd7|1#9y#d5gK||gj4!L|VRx;lgxfCw2!I_L1xlHcT?o4vExuTIWg=FZqLl`3wg)@PB1L&XE*a(`2TF!0t=bn3 zM61F%FNF)kw-)F7tHaQEO(cqn$Cl)RgBLFkEI08k%-~SQjm-8>F2++Bb#J#fOu@D6 zl|{vMfp+|_I}CdUeX-OLmJp*S-Fp+B@OpS7o>6+l`X~J?&Z0ftR;|1Q9*vSsLr|?BW+*FxkOfq0qCE3V+xZ?m-;`$MKl%06hKpbuzsd z0KxvMEG^BO_Msry2V?~D{UO*wi(tJ#uo5Cz$$Z($#!K?6B5Do~OT8lkO#(S+E)~oB zE!`#~Vk+DG0dq+t5k^`+wak3sV#q~!Mb%XKTsKD58lZ^msMm#Hf7(|Jt?7h6P+XU2 z2(K)zE=V-^R|(!t?!{(%c5%2kIDK4kAY9Xs2;(V-2ZUwgZF@XQj0YcyAhLSA49}ye z_H|>pzBIo$7{K0LaG@4mUYAHjqxpVdSfVlCUswX_ne-TR0!=KmWoJokN$opy-`t7U zSnu74cZBecogAS;HvldkYuV_%*<-$+!oK?j`*`63kH+1zktlf*_U$_n`(8@x7r5O~zUU&X}s60)8T5>j>-krSA%D79Wz#747n z_LePRO2U%!J_m&D=O@8!=K0JT%y7@(4c+~AFYX6K3O#M(#B1-A8C9dvF4@Z=deKdT zbU8r4a>R!&u-Ft%;GFnRF;WD|dyEw0ReIKyiyazvgT)g_*#f*qaX4mNNVv5z3FT~p zg{boxNz6}IAby%dutLSD%k^i34x2sLuA+=(Msg6D(NqzcptHlwdgY3crjuG-#+i{p z%Ov5O;_MWMVHDY2p9yO{x3X*|qhqGE;k{|tnHZQ+@`zGm7#n>{Shd=wqgX^}6EU%- zWTaZG;ZWG1%?wZJUu)}CFszoCsf^ZLeMJXd-)g6Iz0an${pC@3Q3V84h!eXlEo3GOu{^FJ!Xjy z?};gxhxbTM(g;y)wtQ;8*0S{k27Ak>l$8?|GR;K_Jl#{(Z1yIo>h7>oQmP{IkAmkygxM0U}{^_>=-2+4P(KTQ0p_}Cs6Z|30*y$MI~C`!g%B{yz> z-7&=$MWuO?nDBIcY{s`Ff-tSm8|(XK8tZlWq}9%1L8;b^(J@}k zER6ZQWG13nvU(Dp4lJ0K_2)%`=-PX$^Bni9Qr9+iEIMAUw;fq7%Hnv&H zBuq%ijO8d1XIL_;V!8AY?KuogtQ9T~nXCJys85T-F!BU#<|u84-os^$Yycw(c1>ny zVr3Z01ns7v9^Jh+>`6l}O7(=N+eP{qYd)o%+>uPVd3l*j%tO7R~rvt8C<<|_W* zMi}Z)TY<~ pCDznbYdl#1{6$X7w=0(|JbSn`+|Zl`qRJp^ED6kv*HWJX&E30RRH zohgd4!$)&P2?@P1vcX@L6(|lD9C|iCJSk8VaQx0gMJ4&+V63e70F-twYs@XE+YJ+o z*LWmro$qsic}?UIim14ird;jHE~#O;I4i{=RO~T!g#;*#Dj<#33R|u1RDsNvM9D(Y z)9RM$_I8#OVyrN%~xI$m%p_O0ANp!+NK%rbf1n z0c<)Eid|zT-CZCnc`uS&E^WDdhLlHaV$~#Am({XtI-8^b4y~zFm|p6(NdYonab}DX zW~F|q#rWxxyO}Njl!jly4zQC%^b@A{SuEO&XGsSn8((?#9;cVE9^y5@I9{V9rXFS$ zdTW&Uu1Iecs;<(8f0D%#<^<*j$)p68vaX?B&~aq**igdvbR*}ArS6nIWWclu1SNs5 z^;t2(N@{whVNJxa<)j)yJy#m3@Yh8EE_kuC$_L#cV@ppOvId2$mFM=)S)KSI9NXqjhr@OKsNQoEhkJ~eXnTY3( z4^e)J6mUSCH^d>-$Q4{jvS*Cod}0!8E<*`lMzLnLhCtpfg|X74_`WWV-MnN2?6DtP zX@`MS$+GApLu`?JOthFKs7lsC@v}m*S2mX@ru=i3g7Fqb-eN_MTlvLdZhV`gg!H*?IGh7P9-=F=>5w7zjf76xTW9cALMi3CTle5#QLbzwx0%TOiU zwSiH})`R}Bf1fzmYgLx{BTJ$^Akm+YMElGI zUAXeI;Z!7gNta~iu&`gGHI8OEOV!OFVhKl zE2~g$Pd2n$B9r256vstYwtJ$45i}ee`q%?D??H(Tio-@Rf(XI9ZZ`-Fc9Ib>$w8(^ z7Q#;!&m=@47EdfAsFWb|=!HOFIcudHju1zK4o8Cy`($Ql=T(wqE=ebA%PjVBKL?6PKpmZffrXw^{GJ|p)#Vz%(V+++L z&qDfD7GSqrlyH5gLXPgio-p={^7%ecf^`rP*bn;HW{$g6NG6i4mlBCBYzR@1c}x?z zK9SmHAkvdg$%rgZ*~z|L#HqxrB4#+(O4!hN=S?@n1f34%$veg$JU}iA1UTop02gUb z&wH*Q?;+b^t8Qm*drebc(<9@t42AtAASeZLv|K!A315{G2w2Vm1cS@F2p^&>F-9>? z-{!Mx{R+v?aLy(ylRzS|?~qs}C1s0DZW`G6GB#fM3oEjS!~tL*Z<7>?V^+x36$3Gs zjb;y-ftX1|&XHX7xx~iu9cEcA(aI81n}kZzCs;RS!B%yZe#Ho-yrXQnD(EqiwBgoP zE%9px>*-~3Juo1$8QsWdBiN<`l48gzpj^Heh{LKFjrmSRpnl!g;Xq=STN`f!S(Oz* zo)Qt{`7{+l@N)2IDUYy9QLJ4Ks|_jwkYMNd&63otgZ<*bx(uAi!jU0*orEW>q(TZ{ zUdAdf(A`pYPlrGQ+_W01>|?Q%K$>h3AKOMA#xPPeYv&NKZDg?=DVN@vLx)}gLx#eX zg;K26sIvpnpIv45O^X7JV?>7oP3~jmUY!w@=dvUf|Lrp2X{kW%@i`WOA`)cxBOP`` znFN!j^bJ&8<8*wNq+ck`{o=6hE#lK`rrWMQUe(nHzPltACS4U<5O3b3P=oU=(Z%`R z>4h5GX*SXNiCwoyiP_>X^eOS}6NmKe4!(WK({AykRJ@f=+)+6wIeW#?r-+Cn93>7~ znZyjOoj_uGb8f#x!lb4Akje-dx5P(=#B*pCNC0b~lM-rm9{P$z5_{+nwoImsPI(Ty z$L6^cCUJo&iAPMr#gY}RI*+t?UtN7$#dx^R0 z<#Xu7#33T*BQs`3hTSVE^)|@sf6Qwyja==fGjo*;Or|~_fXf4%wO8UGwL^wQ8vOn`Q#2Sf$exQ%PPg%sV?-nCL z55vEuchOm_`D+n|eyPGx|0(xM6oWp-yz`_0;!W$IFH3wx3YUtAC^Zs6kS-D*!9-N$ zClk+=h#Yb3(uat|fwd<22|=c%Z=9rcX_-jn4#G)3m&GtIQG!L;8G-F!=r$>qbz63~ zSOVA%I!QJ$b%RcaPY?M?97`pdbqr*MOmX?ZSZN0wm?6EJ{|olBYeD6{B!-CFUJHc8SPF1DXtB&0R@ z0lV2|w*r{Pgw&jtxtS`+TEoK? zQUC2xWqmzBv++Cl1?3WM3|y?AJ>1k*9D9~k|ZpdpM)imhvg|6 z>7Fa`X09Z65zh4~%yoUwb`!OT9c-i3A109Typ9wzTO8sF>td%^pzS^pgabk!fyu6} zl8jJD=g&|CQ4x=+iL2R?f}eB<6Eb6V({*&xQ*rG9$-}9zh2=N*%MaUXk3ZZJ=wr{v zOQKWk<6hOqLUaS&igE9pI_5*eN zgw$2Wv^FLNV#7b}R{N(%P)OO2Z_86$J0cVs!lDmvtj%;mx^rR<>h=^0Lx z;h2#=nYCGps}+ZhSRp=+4$EYiyRWz=UT=VnVhgATslyc}*0V@G zxMho`N&pd&eOn@*>=rx7*0|tz5!UYQae`$z%tOeomLfRESnIr2pNOc;WdxIbN|Grv zSI%u=#yWH+c*<_4A6E2WnI~+3?UXV!grJ!(-$a94@l}aKAG6*spY$=w2`qPu#OZ2_f8Z@ED3ckpf|E_~xSu9^nnoAG4J z+7R9|l+x@ZHdp*J#UTt+DAL#^L5ejxUfL%0b42aqCpnUkBSn;D7W&xSFH0*gzAw>Bll3byna}L{PF^fH7GCIVo2FbuuSusm(k}%>QV+kwzSTOs|bS#^VA?M?c zg!{=PWFy^D9%myKz=%T|&viep1r88gtw z-m}`*CDD7W#!s;X|6f+ZeNl;v{W>8T>o58k8iK%2!Y&mg>+>4_{#!ddn25_K=c!U6(K+rK8hm6Hl43~TA7p%t0ac8&8(d5<7biNVHb!}JG_rWs3J8fmXqzB63QXuWJ__AzBv++Cl2`l$$Pncl3FROkZCNGu=l%%lzMbT z*@VlDIBk<_u(FdrDNNWYddXmmW{Hn70C6$3Rjqdb*dVezauaqicQ7j>TtSRIN-g=$ z=+03@n#8G}?1Mhi&}k-DbK=g?wUT}4Y5(c?#t9QBc8+><=jeQ=M<>t}sq1OMTT-mM z+r3pjQ{X*83x>$e!NOBGOqH_V%`ZxQTu0iaC#M0Zt4dN1zO{=>!Hy%J8UNJe=Bbh-nj2a$H>$Db zwW351l6Y zRD97KLve~FIgE8EAUe-V@^{~)-6p~I3{&@9pJs@?8h-LYI7j&Y!J2on&^^r2ojPoC zPrf^N@_oM3aev7iTx-L2l-=C;rsN?nJ(0TuIE@& zx_wBpu@sI96SEZdj`)%%NjR!3l%K4UxV%zg8NqBPwUqTTg2medfz-W09Y8{vY3L)x zE|yYBX^bEw*#Fetwq9!@d|5f`B?2&vKKmSRX@?YMCJ@jpgq>jyjvT8c-{2=(>H?9y zBp{YaIa|cpDGuu;A9Q{1yl3p2gRyqQ>S+nEoc=oT-zUy#@16o#H~QhS_LPAX7Rg-!zh9j1~bgH zM6l;237axod<3q2w18C@Jx#fDFd4Z92Z9y5BQ$w13B!mO@WjT$t0R90-b7mv@+1x`B{ONDxUm%0v|{=L1tiWpOOse28kO zKO7uh4i?l2{h8NhCRCd9kEup#YSn%*iS2FenKJ^XrMaO8J_eCzFkk@T#Tr^br>Cy8gOe;&a7u>6ox0U^fnejx@SgKFKgx;?Tla zI*TCc)5kD=GB*c^8CgO0U}5|uYave{Igr9R+cI5+Bwj2IS(RN}F_dIQKE-m#yX?M> z-R!i}<^su1nrFkT7|res-G*oNbl6sw$C3#pa!<1A`BEG|$^7VZd(3Psn|ayyeUiid zWRjSKb&In?92UTcL-I)IW(K49wJ+|SGN}}W9 z3^`nVmv`t{srt=H+wg4p3CY-T*@h2cV^y!-I%}mOM*L-x9OnIRnKG zuug_5Vk6t%fEPk>QIx6w~zkHF5I75~IUCus2>c4uCYzS{Tfjtn5^d8wN+$H;` zG)E^ieGQRJUS%$oc0U*!HN*v?Dfw_}(@13va&#BNh)u*qD}N|bY1$9UMop{0m=g`r zn3M3+g!_BisG*$n{%q7J1F$bezHb{f%h-lLVx#7KNZzOBB|4Ofrww>F7|DBLsV;wFksGosN#qGDCHA$RG?=biS8T(NSw-6w2&PAfs>d{f}BOk%-)F z5O*%4&y6LC{!pMsCO{^9ng!Dzp|~rEckb*>R!62nc1r?uCvEcAW~rA`GUrH&;7bOF zk=tgBAYzh5(&x^)Q#ss!QJN=|h_akHl#l!gO7o-xI#8J(F#Wi?Vji?Nw0=Isa+^|x z+TUWGAD96nE$u?(FZ#f&`4bEnxd^>eP~ueRZWdP(Ti$KJs7(wQ@xsJcN|y5O*+qTw zs1XeA@;ad>op;zh>76LR15=RBk?6J|mLNmP=$~W>GBU&xB+NB7L{G2;nH;nP84yd5 z#o=(iT7ra_;*%aYH;T)Fo+Ca5-I?2NcvdPUqc|0qUzAw0q|MxT#Qa;U_cjl{J-y-( zdJCf7>n@Zp@3kYU4qAhxu#kzXes_DEfk(vNCH(SEmDqq(mi;lJ1*c6e44PPnYL6kc zd=V0Vu{}q?$f;YunRTfcVY1!DaW9 zneb|n#1rc&+A*b75{9*GmiF$wcBbd_;Z7vX>F(;0Z8DuJ6>~9QV8#B5eku6V;xI=_ zepg<_nQWaz>cT-!EsdJ8BJ3GXLFF)8Skq=kb(!-!E-S_UTaFlSAD-HMgR$TRPPqef zynD_{gE`)p($27X^xDKH*Tu(YE5fnTe6$wZE{u#3j zOxIoJ<3>fdl)aV}sCvrmA$|(T_JB^`n>JUIMkrpH=1Q?Yz4i#7^9z}aDgl$8hfPc7 zOMpk^LnH~J?rTye7Y8KD?OV+^)1X{)?!XAsw{gIEy}5Vi9&;`9ZpsmQZAXDqyJv=} ztlR*jTQAnm!S3>$D)Xh=dup1@W8Mz){oCVJMde}VH>Nxug#G2NspcxcpsG!jy>~lT z-C=&=bvouJc9m2mRB^8zDYY<1$; zz|M%9wQ+M^1cvX&z?fB3tT(qrW-r8HimC9KYt`-dn?(_GLx(BHf!dKpE3)#zn2tFO zn4-GNc8m?Ld7xolv^@F`c2!g4%4>5TjVjnH$HP{z0c(K!5cB{8~V+^<9EvjCv)!u&QmpJ>#&IVkM(W2 zX5=yRY50G;-WN98hJ}_kn9r_1W`sze+6WLirRERAoXntqm-j3%>70*zcuac28D!GG ze#tWFS3P)4X0&O{ysmNCOq0kI)A(WGoacpBb~;zLI{^^=XNBxuPCs`2XPO#xJ)-tT zz~_i3HKZGJL0dY-@^n+n3D%yalgFg4k*gI)=PKlbC{9dFe~yK$)b+x}ln7W${RDH- zF=#puTm-e|f#-owEuW~!YA9~_Z1ii)GMf3Fv3Kt<3w!*|&ZlF=31=TJc|C8I_c+g0 z&EK=Az1=kTg#XZDHZ>oi<$RoswSn$2JA`n|i?JxnSt-CBMksr=-c70KT@s8`U{6Ieb zZH|RE6%_fioC!CTnl9+|znbQ~!80DW#eL>yX(6)<@5Q{H)&)LwKS=$}wD_iPZ(rJJ z%6clYXHHx;wA4~3qau5fS&?b3a7IVLj?9%ly3)q$FRYV#yO7JwjF?*@&kQy)3#NO& zVFqAJ&OZe}oFazpFUrJP#O!MgnFF4Xxg-+?`}X0+n!Lj&WWT>P6f_4Bb5Y1V-Wtjq zXTIvmG~aHG6q`PTj*OUIWc?w$QpA4@3z_74Y~t}n+K-0J-+21XkyfAiq9Ee571F;`Li>|{=j~DL+ z=6Yw2D1Q)W6ap4SAX_e4uzOR?Up{}HtNQ{8WVoOUEwY!*bI$G0HgM11BZpIH!sH3vankC{_x zG6w`hAzlsh{_IE3EHw|eIs@iSkJItO2GfxF#;o0@9_v(ZrpMHEq2Qvhsl`gkH#WgX zczepjRFi@gLm(s`sHpdEEH;)uDXEobXS^T{LTGAHx+=5W}Vg$$-9o|vB8Dt1t7GdIEF zu=C}KW@g;n9BJO<)S7vHW;`Aep3`G8VF25Ey{ACf03Hdw#3yraStMXS?t`6!=w^S^ zoY#+WgN!WhaNt%}R$v@vo$`v3=zQ_#EQal;wSNEDmF;8eG1@-Z=8E7KsVk$=1sE%n zABrxR3?zl=RJ^hf>I8)Rlkna~vhJa;j>{{5$GIAp%jMa=tsd_uJZ7hy2>vo{AZj{M z%5N}Lc8QsT;cYPGTE1EExGA$1Gi00D0kE6B>od)dheZz5FA7h`N5s4Ur2U)q@x3zV zG)LBgFhpvck}%&H7B^pBA8Igdc(UP{vp@_jZTKB9Pq&23o2^clQ)aq7eRn%o|Lf-R z;EJrx(eQUW%_VI|{i_;^qGlSVmOr$@ISkbekw@criQz!OjN@;cUk|G^cdmEZ#^&cs zt-l=RGo9;!7rz>I#N3M}{S%sW@B02%%c2v^FNU?5&#m{}br4fzw{!WXpPBQ}YwwLC zyw{JwJJ6r-ywSNUW)2T?Iu4k}nvea=^mv?%UcVXBC9hYM%7Y6>{pR1#axx~|_e9W~ zjikY z!+;Z;1w5U#I@uU?R(5tedvb6Qxu$f7)AV||A0~AwO%4Rok9Xl=m1z}xfaM2xm!x!h z^Rh%TJpQX@bzfbvxzmg1a&EjhyR$UQ*=dINSL0QaoaRL7{6*IGdp*@u_eb}k`xXC`~U@Y?kGPY1PC+x*ea*Dv-2Mwsqb~d_V z*-5U5Vy^JFo%cj7uaEwRqRbT+-nr5m4kD~fOCwO z*6aVO$Dg@NbLU-t{m#oSKj*S@FZ!zX(+$_Z`ubPSHgw5zady*d@M6WLOKyJ4rlCDI ze>ZpQB`;sU^TnG~?#m8r{HA!+jQm;f-0epi{%aAoEpKf&C;x8oVua?(hR#ZLWMH^5I8YmjD!XR}2FFJ#Q=_A`k(tQf9GM)BYGc=o zR2;W%!^RH1xu-fdGh#&{XmED4B3Y%JyEQ#ijn3UUH8FDTo;`ccovu#pI#*8I&S@Qz zle#Iq!%~sT&R;E(N5{rTCa0oZ1J$visR_hwky9JkZ8gkJ*2Z>Bjtm!ub`Dha-o!xl zs*!3`+c{O8Dfrun$Rd1fGL)xM<5NRdp(a#}Rz?*Fl3b(X13PLhQKbg`qsr9yuy4QQ zN4D8&WoT-Ac49IbpPJlJ(0}GtCyGkroe?KT@Hd(^Y%Z^AQKQK*WK@}*oUM%vx5Olf zp5DS@sP&tB3+)B`smK>W8E-w?`&ts#DYZ(3wM1!?3WHaXmUw*$H<6cWFmY zPo=$WbGcILEp>HlUK?Fn?rE=d_bSz~v7^1*0q*ji&6P{LI@VV@I@d)`#HH&ttfQ3S zftdmHx+~j!{+bQtO1W*##*R`nK2VzxvsdF6d~;>P+L9|eRGF@hOp7>}V|*NqhF?xkO~O2t$&r!ak>O}ysIqfb>^eAJ zK_AwlUUYo(`L6u%NNr|pa$sg`YO;crhza!~#wJInqKVoL^j38uy0p}`sjH{+a%b2z zZEGuS8#k=qTq$qu>WD_GBO{gRsj2a3Vqk9tYmlkxzRJv01wQ5SZ|6JjXTlJ zt`Y5s88aj8%%go(o!Wz59ovCZ4)u+7J#Fo94zvp0v$?ap0U$K4tFv<>EFJ0LeK4Om z=1x?OzmvMl>mZhOo&+(KQb%`h$L8{ewvE=GwF&gA(~CYjxKBD&JX8$1al@KQUq?@A zL+57cFzGAA8JD*>(wyn{?@UVC|yk%eq<_MWW zqUnKJtul@p;0WQ#trRlWf`v=Ph-Q;(7bW0bDItu-;Z5A9qk*m z7dN%{R^V^7%Gjjp7}bWVW79L0+VsHCNJV3VDljxPJ2@i(Z1)&^dT^jx9oUBk>v;CP z=|YwpA{wtQ>0P%@9j9Gf0aZ8ys&Loe8`iaz%8{EGCZ?eUMzXq0$0o#44MmzPb*`(l zcW&zH+zgMk{*-C1GE*JE#iD4bvjnqNklE?f*;}rl;HHjEojqIe=YJ>1W;o_0jOb{a zXLILXq4!;&8XuW~ABY`BtPe$<-p!@nuCC4=jn2}suK8Zek{f9qTgp9cn>#vtOO>^4 zzy&doNCf*Z&{LBDk3#?}f(ybLn!F|}g*#*WPuxrY&Ap=}FH)YH+nHrh2bFbxNp z#7wVEa=z`n$XQbi;}vs_oYxgnx8#8zwrzsq9PlN~OO;Z4&xWpYwAD`>db@8!Pr0{k zBS!jqmtR7P)PYF^)0If*fQxo)>2ecTb>!+^br2u%}RbY_F)IyS49 zUMk_FtF2V3lrQP&bxl%h_qA>GQ_RrR$S7UXdxW^r6(dNC@22QNEj{J z%nlo_=!oW-xTa$?+9@Fllgzk8D7C%v=Eoa0cVURgio$ofQ(Tq~(a`vqglt(_g!|r& zWYW=6I^s4s6NyiT+0EuxKV^$Wt5Xsyd(F*-0bGlife0w)kTWqMOX>ty7DNf?>yIxdHU>iq0md#N#9ZS9bZ2qirL=|fmd z4O{%HPVLYMe0T~KP7dv>`1l~<-s!iYRNAn4y&K_U6B4~SgCk~dZEv^rpqnZ+u%icb z)NShQg!}txU3{?}0pqgD+77szG}bM)hIY$4Iq|FSc|Zxv*`v~30d3N9E9lrhNxf$i)5xie-4gRYdgoL zo$@lew6`rrTgcPVyQ%HcPE6eN(+!*BmL8N1flfLQtMl4=%zubB@H#D`lX<1w*;!e$ zVZG~9Gbom!69Yj(-yX~z!y|iLR$Y1NoERpy>cAfLWaM*IxaDrCqvJBQ^3HiKB|a~U z)}gT)7M-qui|?D-HgBaHVe-K&IX<#`1k0vaU~}s%HhrxI99h0e@3^f%WnyU7`x~l` z`CAA_rOw_SxTQ0Q8>ySR%3Gx?YL)4cs?6NBG;-?)?FJb;SpLVNc-uy-o-ll{E^_^* z9fa_u;bn8%hK(9N+?0)tgDtuShK4YQ%nR68J54$8WK};<9jTyC%-zJLB?h>uTgM{S z?Xy*E5T>fK+i}ip!O0DW(dxj2j2GPviQ#1!%c2R}jY$kKjFe5K^_7iSDd4J0iLltk z`cqqtDC(Ah^dO1OrLwGz^uFsnzdqN_a$1DWl387Y8EmJ+cCft~wcBz{mxD6kbqj$= zf!*FH8ic*LhKDh1uP1c5Es@^swa}~B&By{y$J*?4#7&fh8EGb0vaXXuY;EuC#X3jZ z%>{Qnc2uS&$M-p3x6$rHs`lch-clKBgVNT`?a`=g*qn{JAyT~3c6wMmaAI_fTTR4m zlU(AhX=}es0$r)x+0&sh!7Y>HtK|9XSM>oJ$t^=&U&!RB+KAc1N>=rkfxoG@{Sp^Y znVpObbTmyM_U@>TB z3db5cgt+vUagFW$dU&^68;Zs<5vlX4PLc)7<@M!DoXif1nzpU?>oD|AO?EWCgb3wY zcMMxDIX2PBQ8%U=O0w=oz{9LCrEyW0MaVcj!m)>?hzoCSf8;|0;sVx_xU1uNbLS?g zu15@Vrqi~zb4^EO%eu~0igtJ|&1snEp0F2rOU z-stpIo0yuK*@@uAz&$!vMeF8oecbjJ!wADt;%$3p*Vdj5>(Mc>pcOeUknN)RdVH3! zupS&k`@{>zOfQ`!gL~tKav7%?VMio=Cax7+!mWMf$jc1^>`gY|Jgda%Nu4mJhz?F{ zIb0>Os>bf1w-ByTZP7&!X=W$3c58%if%J;AdGEhtPo=Gq{QVKb~^Z1 z*ClMb#vpf7EP<8MsI}LHX4aq+iH;}dD{hS>AszW<5W9wyN5wduaa34FVabk@cT9sL zQoy2_F8*YK-7zq;6DuVtG=@XOp&FLQdlAhBu?%Eo^Ur8wlHo%p*(Q^koE7eviY?-> zQ^$EbMpK-FM#hO3S=mH&qTJy4RX7TlKm*NX;A^zx#3ie4bweH2?(~8xyW`}2_IyEH z4f}arr(fokmb$+J?ltbHK_R(2*o=uqAaF%n^daYtA z$~~0=A_8 z#DOuK+*WrCR`v~HAmb5(%%L;YW8ih$ z#KuqTEqSe++Edz!qG+nDDYRRML?zXk6<~V_C!$QUocZA>Zap$y(>$V}j8)amDPJ_@ zTcV+feOF1luktx;k?BGNPEuvNRMX>EtpBxVwZE~*lci5rxd$Nw%U<`^0@m7iin1vh zu!44KAlv!zDQqQWeT*i{I$0{@BMQ4YwtK8Lh3642DeHFEOKO?e%(xJ(<+Smp;^?p( z$)NUly<)qVABiq*TRxWU`_s=UCq9OeCA|+P;ZFL<)ISiRYvPyY(3=%z|eS7$(k7 zwX|DisT!`Zwryl;usS>G6q1R;Nwat!OeDqJ$+q?c_H$Q9a^^8O2GzxWwK4SeERIlw zf%RgE`DPPIa6hcop&yE$6Z!%&L+*j!@^IxLgEp6AGu3F%aXd)bgq3|xgL6!BaU0x2GTYR93G@s#vb zJS())2bgkdp}Q=NantHA`iNtAY#5O{p36K+XJqt0R6>?vtQ>~KgWyq&%gIer;AMHv z0cqL8egwX$u9$wbSeva)<5@2}2!mRsi{r{820z!hEul`6h-N!59pd36GO<7`3dC3Y z*mTMxAr&f5Gb9pL;H6{m=^?2pIUNWmrbJ$Oz__V`6Xc@1w7APEcUkQ&=ex@VxU7|} zsXXqrjnF1}h;|-s;JJ_fyRNy}u2L9>_xShHuJz5UoL>#&>ER|hfp^JWqhq6$f$3?f zU7p7ADr!ht^pLB_lB?7NY4{f^H#-?EvJS!gs2Qwsk%Rrar9>K1A`BO44K5eB(zU5k zq#^A*rbQGU4`AR|uX5aQbqt&w<>=U$u8qthPS!9fYkK%A`ucj`evbZY_?(j5$=%yTfA>@&dpVo=3{eITpK*^UO(XXhVkT$ndN@ z2h@jxuDLoYWkhLYLI`(DCoL+mz#UB?P+)N@D|ffehKewjthxMd0>|t6gcYL|ABgSI z6}x*SKpqrFHI1ob!+SB=MY5uUqQhgmG3adVstYbGDsUnlAsa@T8|-qP9iQ85pO20h z!}`HDM)oaOJjgMszzQBjU_p#m zmnOLi_zb`=a&$=RCR*nK>`ZH8=yX}d!>(BDqR+7Ov*N=pp2otX6X*l0X0GVztjvhE zP7!5wm=2Et;usj)FAXI%oXJZ((@0*Mnyn6vM6;9n8kLQ?nLSgkN4!j%&2+Hac3GB% z*jrBS!0Roj(y8noVY|hlJ@V3`v(wJ)a8@%kGmE}UHFacC*BveD30f~6pviM8J7p35 z;B$H?U`mfnjmg_zLpw3+Xf5*%0SA>gMuukaD2|UI#I56PL1)%raoYl@4H!tw7GkY= z?=Z;869$|tLd1wB2E|NXxuJL|9*!g zgMjv*=MQcfrnhVnHzopVBl;LEwob;AO}yyAGeJZ!*#Tkc!9ztGuW@ay7n)Z3eoxgE(?o&ai#8Wr``_|%Mas49&rr+Y$2wn4FE0ZXogo4 z?A}pw_wn8nf<$cay2Yt8l6r_Etf(^nnWqgKc>n@Vw=xxftZ18W=>QaXKhCh-XV~)RoUyi2}YHVuf}XpI`w0%a)bs* zn;on{aY`-1osL*eM)WTD65gc1T&3qQ<~@37ZK|y+vB!MKb0boxKWxz^v^DOa&b?HL z%B`(2Pu1b=hIK8%%!DNcUZSk(L^FvXh*P!--jjsSAmz*_3wz~t-ql@?D~c77&+6P> z8tTP{ds2_A$7A)#P8wNv4e3-Ot8&>Zpr6L^f}l(?2-`d4wIqACqHiSWmIVq2$>x8f z1GD4SSoeyL=1f$n0~4I987sIkJ>S5aPSWU@a9zm&{oMRi9ZkA5g_Db|8-xuHmd~Y-p!;(xltE z*_7~1gRo=65nkHO8{9ay~l$Pj5!<{^uFAEcm%AU@mTWq5##SjZM%gEm8 z0UY%WPR-0rO;kpP@xCTrJ@KW~&m|7mW~Qd)kU|T=9UwwCGvdAAD!NDFW=B?IfpvpL zgdighcXT&pF`A7?4Nt8HwfLtgl0#niomZi5$}lSN1}&qmwA&qXYm6SkNWz-VO4Ar_ z_Jv9+PAmwqaR1qn$X;QP10-3Ih7F|}dZ)}wuCdY1mfbBD;$qpNofT(OXJK79M`gB!1WvyNTLSsIoKK%~~eqMNk=tIK3MyGO^2*iRh+t==#46* z(@>4OVFnr;8^E^Fxj&}gop{Yiyx*(ptQD_ncaR<0)~t5aLF=CP$lN_THY9IG)i9P2 zK6y5RCAe%Rbb&6>NxNlYdS0gFVq(a}hGNCMCa71I4J>B8=um6g)Nb4 zp`!u&F+9saJdbSwaQuL!keuVdW)>B+ge|VZvcU;*uO6@U%RI-rmzLvsb#YGL@EeDr zF}#DX;(1GsMsQGPN=~9*@aRAmnwY5J)pDGTR{*iQutmbIVgJ^mmeD!U9(F3hx5eVh z$n>;xpjMf{Ofx2DF*bpzlJnQ+4C|q|SZe~i-m&4L`~&~S+f@?e{W?q+n{G3wJ1UW` zJC~p#DGTqaH5c`+@h%jHYU8XMiH@1K=*8w1=CG%0)*AJvm>l_RBieyUM;{1D6c%@~ zgE04GNOH?k29A$yqP$nH?}0lSyE|?e;t$ON>7Qjm87T)hj1>t_!{C_`gSZ;AeM&s9 ze*(s(t_~wUy>bW4)D`ZEsEnBut5XSD@Lk>e!&Z95YSG+T-cO%$t24c$TQHWj4+L;x zBJXAh>x|8@FsjG6dWd1QSqWYI%UeCt2Qvd0id+a$w9XVzFJ1t`<#mw=?*QTFZ4k!v zdGY+m#3D`)gC!Qkha~!W3=aSxlA^WcqZ(o~vRQ6hk&o&(J;-bHq}xA_OBOMs6>(LZh@ek&?IY%JqdndhVO5g6MB+9E zGUx0XmacavqW<**oPr_%+bcYn2(VUjFS%DocE`$E$054gq$aN}U}DoTDZ<@xhrC26 zldODDB+lesD)nJq>(Gkl94Nq>Hr*=y3^V~ZUQrqyzI7GR1NNAug z>SR&w8f7oV=wnJ4%wCH?@tSPN<(a=%5ZhJVT)~zz)m8JB0%#4KseQ0As1N;|wMB>a zYGsE~xMu+G|2d|*16D+#LAmIYHF*q&M(Wcw_aIFksgW6+9mBU-@?cT&xgJ1YYu&o< z=P3ZQuweV3tEpO*nxu!_V?k{QrUSKPT8zFsgZH^M;+rJ-2*>4%Z^h+w-cCNCh#XX? z*Xh?F@q)v+;~wfU8&u;1JN=d*mV0b;Lb_+HrWXxFZo7`Kuk#TO5~uJ22KT5yvQo2S)8)d$~bj_o0r@nBGikwz;$=bFmg_gHEOfFw7AQ>aWF449*0A& zTXMNWD={phB>G9tG-Ly9FG8dmHNdR|4KIYcs zaC)eNV$$u!qP>j$2syUh5~|s@V17|7i|k#){_&J6r7vQr2zzC1barwQJI*P6Xrb#N zSy6MxC+bLecMZo4r-MEG;#r7$??l!oZoBEF>E2kT5$6i&V`SNr@2L)8eWs`TzMwv} zOsK|HhXn7+5LU}q>A{v?jX2&E)+cacmZCbSJQc&W7 zvFOq1ZmeN+%93@MJkxSlywxxwb;)sw3DXcGcjd7am6j(+%Hc_uI;(z`OD}O}*zQnK zA2w-RbmvIYESY9U_6{HpjJSt+u>>9sIf1CrG_XoBq3A1V@_DFc!Fp}qBu-tX{Hsav zitS56H|xu5f@TT*K(>g7;rPh68BbjB);9tuws-hd4S6kB77=m?u21g$cXrM^V-jTX z2Bh58=HtnhJ!;UjdYvw?@Ja3TG+v6*(|of89?r?boxP5fb9>odVOHJk?W$QY5#tfJ z4U5^DjOd9Ge4;9^I=M}+cfjOPsM-Y^Dm|Fiy>fU62LEuAH_uje=EruoTG7*K6UsW= zXp^-&M!Tq#twZebf`~F9iM-+5y;{)%t^@t~sT`lWF%>%}S8;NJBd_LTeDIjsX8Iw# zt`1MoIlI{G!-PA6o}CWUFdL*%2M2m04J#3tgLh=v8{2s6BXno*mfb!R4h^&qnq!m% zToJ3sBh4ub;Z$dMo@mA)J(Ee;D87D5-g1pB$|x2k&>^lJataU)4eEiAL_OPi>>3uR zYgV)}=_9gRl$aQ~{Pr5K8XC{n;l{k|&SMZq?bDlzR_WRx4l5R( zSHN{UCCgL;%ghApvM=001!p3OjWU9<$kJmkH5{{I7Mz+667ZZ+73N%#8nK1Qyc6XF%0F^tI=_p zsb?mp@nl~9ZI*u>6x1UBtdf6L%RlGIKj+Io7sx-&dK=I3RW*I9%)JBVM2Fp_-WnUl zu~95*^Lcym_&*d~wKp!Pxn-|C7S_Tod+|P?*uzpSu@tgGlW@1WxHm4hd0x@xz4Nl- zW?XRd`Frst{+^oJ$5(gZ-V3$4aj8%qgUx4Y-D{JQ>esw#?>wtqu=j#k-V63}2Gh)| z=V^5Qd@B^^S9AV6qcpFcFA3VW#_Cx$FEd)^x+|{ed9ajpr1ohuloXBNPVkA)wlN&c zVV4_gD}SxPHFov9)~%jriPiHoYLR=g=W%YQB6SPo+{T@t=uTvKNREzm`q947LcyW5 zP|Tq;EsY5xgBR#cwX&dC>+FWvOj9Vues$^KTP{s!vXq*%MF&iaj-3|A=x}LKhmmZhZ6s?dxVt9(NO47j3u{`2TChi}jK+{u7Y<3dziU>!HW@#d(fkuwybrfi z76!x7pv){1VRc#T&Ql}*R0Z36d(T>(PJSC2KWHNdUU>Ufel1!K{ju4^J45;csooOT z)KUWUS%k=U?_eOm9Q>Qu$`BTY@n^x6W;+kB?RLizvcSQ|i|b16^`=m?IX>;Plvim~ z-eOXXq*-_br|St>*NIN}A8!lEV?)b@c?r~B`*K4o!KQuuD!i{U6Ls>{g|>3fhAkC& zx!CN3-+RzU^Lm1!n>TM@t;d~&P$~4lz}{W+UQMFjPEOGt^*7tKB^s19t{4xJurZV~ z*Wt11!>u*+XJN3Saywbap+DX0HhSi6y6NtYMs%O6;~SVM zJTR42khfdh!N#iilF8ep*&}_NBwq$&nr4%mJ%S~%xzOI!BPw-Mx4D2pYcpc`+Kkw} zHq#;+4i)uZeL^tQB7G)bjO^F}DV5!F;5ZWPl;2YtYDQ-Hj#mocU+jyt_Jmirm{&VF zBE&2(IJH+_*^!eSRd1+Sw`$QYZG8*I8*b^H*wTvP@Bm<@1wZ#8I;cRErIpBo>p?rx zllT1K6Yd~-sKr$}C<_MWTm@ z(`~+{nnj#{y&PtQZO}!tc-jaDUM0IhG#$@fv}iPhhiM~K*w6ra&M^toYdf$mpSF*> z^f(WDCpk@R!B5d}(BpdrymK54$qQNd$OY?mHKA)yQOsqd#kv6u&h*fVp%Ls0T(%a; zHZd|hhIa#p;PpsiyQvk0=wf?V-<{}M6&Vc`otZg;iz*&p3J>5UN*>R`1&bcRkBx)( zjZLB|)fZMW1?A`%3vgFYG&_yM0Gwe>$s?E%c_8KdOU5cl=?ZDgs$t(033s?5Js@KS z8E|TkLl?JepP3RDke#4JNH-AeIf4vCeJ~>cn-*-|5!*wyUHnPS!3w@=!F$)@M*ert z^aq8|Ux;4zrV>x^<)u&eiw5!-ON8seI^PA2e@m}UE$`O5XCP=Wp8d(G!N}xpJ9WS= zdstt;uT0{FNNJng)6k^fqrs+jLM8_)ZX`*aG5y3QI*ID%-R_r=RB`;Cjs`T>49SL) z`m+M4#w4hUdXgwVDJI)EyiZXbi5HB&sU=TLBo1K;iskkulD0Jb$At4 z1oM>AXVB8Q?(wupkOLeiK&Ge4&SCe~wZv_Atg4@+OyGzo{w2ApBh9d#rpzo;qf>*s z@SGBdTG;QIql{yCL$HP=`&@CJN{Cu=63J@ik(nOI!F}a@RaAlB^b${(9+r32eEVUs zigyLP!z*&eDMyVX9*hF9UeVJ*_cLMgL5}k&@ew)sa(>_j%)C-M{ks#f@Xe#x%{f-3 zf^Uk3F1)Z(lfgUcyx3lYc8{Ihm=RMzY4$rN%p}Azxe4lR|$^q@M@!&30r%;iiPag(8ST~XBP*?#kcplA0km75pQ$NlPN?7 zpMIx3j}lq)2>lsF{DWVS)c+Podve71gD2$j#K#4$k@){u0hBEee>-rE#PUEs@5$mvmlfZDDrW7L?uemmR56<#egC&u*Y- zF0|UN;wA>qv#axoWWkH=?%Gh0u;VWl?6SK(c9kAV3cuX$P1kL;RM&H4+~TT%P!*z~zWP8o0tj`hLUofT0Ol4Tc%v+e{L2 z5wa539Za#xj3N3+^P%*hl=8z~za*8n{N{ zuLZ6^{Efgh5q~FeMdBCXm&4`1hG@@S5fkSc31y1J#lSTYw*;<0ygG1=#ODVtPkeFU za>N71sWMKl@GmX(AJz)=A0hQYbR)dLM7b_yYQ3>2OUOD=Hq_-%y2dhVq(Bj0t}}Io z7hfi%c$aaZ8vfn4shjXjFRMiOT%#JI+FYFp_7A+2YOu}>$7PfLpRcfoFy|}WPWW_R z;r=<_$RK@tvNcW zEDlol5#%DNQ)POp78;Tc~1HbM#%@!fT%g80-_`7;xn^RoI_>iL0sp~1F5`R+>q%b^jG zc!}jfFZzhMG;oc?jN-^wAU-DKYa(72xFYdMfomoHvT?f9W8y2ZjKp^bu1Nf~z%>!y z6SxBLHv-p4d~e|L#PGQX;RX8KCtRMg3{LQV!2aXvRv*{_-b=e;woKrmfy5yX~&O z6wJ9_WYh)D_Biv%t;%NGX#9NI!Dw>U! zu6QAnJB@CLAo3(L>MC#C3L%ZFD*84VSZaDvb*zFZisdpE#)qwzkK0v3E%Da_mnXhA za5>_i2QE+iNZ>eby~3>X9?JtaCgh&c`7Bf44jBn4-(~co4Ww%*vj#Q<{!hqioX;}F zmLMbH!$A+ixE|^C>m62rl`o3AD4siEP)Y5-Z>3o6|3rgFP1a*}mHs9EZQ%06{~5SO z;(xSgEkT(0j=(h%e>`w`;=2NuBYt04r5A`l7`R5_4+Snyd^m79;@=0ZkhCS+f2`>N zUn8W7ScejR!g4vUVv2PmBjHD^N-S#$|G_9%mMQ9%vCogJGMW$F%o=F{P-#J_liO2F z&$o^k^ql9FX{9fomkbBXD`*I|G*^ez}Dtk++b(T!O%1 z2w4sKlJMgu-E}%sl%Lh<*1SQx!hs0i6O&c0Gj-TlWF-8>yo^l!Ib?@KzM7>!Dlq6(NEsD0LtJ|8c zZfm-_t;y;r^LFpV{eLhx;k~f`l?GWY7JKXhRtqZG@1T-B3@WJshvf6E+ND@f8A2B(tLF$yFW~Eq%Y&kw=+-JQCJxRsiY`6ZwXDJhY z!l-4Ka#yXaMax$_zL*>(;@%wZQOQNN#f1$BD@MgddCqzb*_RpYwre~)Iob}{lWn=# zioMsa@Pi!jErH7ue=u;3#J2^mKzw`PnutFfxFYdK1J_D?zCCxx?)c_KOuW=cDA-DT zQQ(TiFArQ3aa-UD#O;A=B<=`Yo_Jm0a>UQiJ2R?+3t995YZ*ojA?sNbZ6~BiH)@!A z>_jIO83`ZvR4*abK&~fOqD&gZZ28ndOJVA%&yo{5x&Z(Wzif)-F_W)6HjTvun}n<3vX3_kw^O51j+ z!68po2tVMdKEm5PRVKW{Qx(ELcxoGA$s4Tya)Z->B7C2x`UpSkseZyQ7}XG6dtIH0 z&?EhXKlMc`gg^IGnebsR?Ye563Hlk1YtsFjS_=Ki2HLZ%e`TtAuJs~aJmZjouK6-6 zwk(>CT6Bcm(m;+Q<+$j^Tj!SYF1?4tV*cGH8=N=}J2^QzkB^Pcr7KQmwQo1o;QTku zF%jIjhmdb$X}+X(3E5Qoc<-!`%|!6?9zyno%1-u%lF0_2WRfXianxL2Z`@wHV$DOy zfuc{>nb_%lxI}o+Q~iW=Z%CupQQeG1)%(qw|72JA1mV5G&^OF6@nfH_oA5!O@9Mca z6YK>Gj!$4I0f@oJXX^{??^twi`H zAJ*^=0~4o)-q>pJ)1K-lyvryI__;b0qoFql-|DFfAsdYi3}MyBfD+-~d8(g~2FmQ& z{-hgbbarIQFu)!aT^lu@RcG=wUe|4ee{IxJ(RGrONk&z~qKiyVhEPz1SJ*8p%;cMV z%eE2TI6o(o?+!WH_8$d`klrn=X*sJ-I}~gxhC+m#m5+*Q(wd}i(JeR$OUxv`#d}ZJ z59u}DE4DQlTxwTqF_RntP=)^UdCMtva0+Di2uJ)3>i~%t#2oyKqn7%s?EVeD?@EN6 z4KbwIU;pg8b6O0*0P38knGb1e^m|E4Txx6$&1ujoK9k?8Er4glsRN8FtZjq7ja`JS21j&+Y=SN)m|!E2 zkB}8=zGREuU{$f7u@gvJtM6#*8H&o-FTB#)|5gs+mh}TcO411!XbuLG5_0h2 z{e&Y8Owju<5^qk8M9oQO$oBXD`*djppv zZhb~f!G$dP%#+<6xIZEF#?(sqO%w0jpQ(MPvTTX)6Q1fLq#7B!YIZAY##0l*cX_?~ z2p=)oZbUHksIRe1c&arVi!s7;jdEp~3aa%b?Q@LPf0Eaui;yZ}LMLSRquV25S_yIb zhB+pvwPYmzjc-9WAr+Hs$^R}ijp#OrG?ad=m()*qyQj7hvR)LVd01aY)Ox_Gdxp6H z#y#N*qjdSoM0dzXxHIJ2UuR-2~-Z_`HSvhGl z>QOcMvUshz6*4L6bq0=E!$R}gu+X&puQd^G^s06dzBw(O)Iqy-=0eiXH1WT&jO;zk z$uF>8<46QWIPQneb#rwl-r^l&8+(_d3PlMYj~8X)YVQTx2tVej?S$+SNK3m#Y6)?I z3E(ic6T_`WbKGL@N%%HjWr^_ZM%j5LlkW*RsmXFbnRF4-L8N9Jn zwm9p|kn_>S!GQ@Gr?7KB(!d0(#8|sEYXIJw8h~0nY2}Me%{5-#JvrjFfy)!G3tS`d zC4nmtZwOoy@uh()5_bo#mH0@b(^8j&Ogw0$ED4E!8n`0y&jQy({PVySh#v`DBk?Z- zmnVKSa5>^%JTs=?LKdB|mSIUqNWHO!Bcw>TBxH&eWGwdBVU&r*9^q%aTA0U}xXVc7 zBcybl+LG#5Ol{f|GfG;kzGSI4S*ds0^%#t4oTlB0)3kp!s?iJ?yS0#%_gfJRyhjbb z#7cuAobc3^TMRznsqN3ScAx9pzh$k#@jzW;@C|_?yv9z0 zMmDL_@zH+&0vR5bQ!VNOUpqYaJ!}2X?7BF*`eb4%mXJf5J*#q(8Y`L9S;=IdB(+`? z_57zP^MqZG$0Fovm{$(7@IaR|6+wx$)?xYwF1v+{1k z>@qD(yU++()AyrR@V8#ro*Z$HeP4#DD^FYsoV|e=Y)V-TmIpHkA&X;TAfzNWg9IrK z6->r*Utju1P!3q3x7rnY`mdIM6SxBLjGCG{_DUs5x+5TMdBL+*Gl|n|GnX!1B-kjeEHSdV0cO3io{C;*F>BPT!DC5;2MdK z3tXN!AGjRxnZ{vZdSDR~%R|Oi;uV1_5%TAaHr&7X~gBLD;*0 zZ&t=gBBZ^rt|L6&B)QSR6!k_%LRRTAnhW|%y3#T$jTcORj`(iVvcdGg_@fduC@4b8 z%E{|@OLK+OQ#;3H=11SNE2a<1qwzoyQr=RP_tMjSdkj3oq`bhcGIgvmT=O+-CA`5? zU4*xIYHLzBn@&TC@b8*Ae(XE1D@%u@s2vHNL{u^l^?rrr&C2r&tM>6wJ>er(471{) zIVK+Wt?MGBNj2X>I`AvwMbQ<6G!&k0S?%~S_cQ2_)(Y(1OHcp9G2QE*1e&8C3 zTLV`hzA$i2#4iq9k+>~zt;D~v?+Wui5rc?$sl2@0T1m@ z8tlcEf1@wgMac5_ZjX@PG@dAW99r`Gb9P6+Kj&G$kLpRWA2o4bv8zO%Um5;`uc|j$ z>;KoXABl-dmP>YnRCkZb_;Ik^I~VMSM$3fBhmf{k99^3u{#=lCM@kky zR%d2W;ub5wpSQxn+@d-YpY_seQJozz=dIICNb4hf60%P-o{D_aTq@S?Bl}M>siy|% zgmkA|bZz0#l9}k)buz334t6BvICNLG8V`U7>8((XqNaSksnZ4aIZXvY?DF6#Jqz`C zsH>m9@x_3Jtutc{%?66_FE)<9n($9ycoN3U`uKjzj|qD`WvMOJ&2%0tNZxAZU^$G| zWCQD#ZcD}AYy;DW_nez7YtnRun$1D7X0D{zg(O@S*ApB=a+Vtxz@ zc}3zEg?z2V_uH}-bHUAvnD|#CQMi@(hk+{+|0r-x#6J#Pf%xA8*GT-+z~zbgNvarz z_&EFEQ59t3cq2tY;u8W_B+dt}iTG)OD-fR?xJKf}z~zab88}lvcm{j-HD+Z@oP;cf z;hcWUI9;xsQSPQx(BntmG#;G$AybO#f+C~}SkU9VIBP+F!1QM2hz5jTGP%(I@Ej|l zL?we69O^Y;TfH&52xH~ak$k}NPx*4)gt2nzkL{@GC#;;z06F^x{TcqV^zDSFd#a1D z#Z%h|TRqi7xYjIzut9j4r+Nsl@>DA3-flAQ^0NE*N%?cEl<1zcXIA_8Su|@yN8FO~ z5*mTc6yfRib*CGXTJ(>YY4`Z9=^~_di=(+l;#ha37jKW4462^-M4gH^c|-M6?@%gr zbi-0?E}WQvxlD-wS_a81PD3|xWuTY+mN{&wK<#P$lu2 zB@ynE#(l|4N<|7b=dC_ViIAn2M75jeye#@~MjUw9WcH?4G71R+7;cd-M~XZP*~V@{y15kgpQ?mB&+1l z;)X1#bt4}V}_ zxIFP4fomk@Z_8r*6o}8ULt+_c#ODSsPt3o5fqbcPM%_Mdbz+X0A5dOp{9cN4gQK@l8QB)V>hw#f@6vht|&o#>+AK}?X>3C!!RGAuQ$trc6 zu~L>>Xq^4plv-kyF2$=JGR~OhBc5C|d!75ut)w6Q-Xt(5UM0>PS$|69%N~K>OXNe} zC#z&Xu*!`0Lzv~~CM|31&_?u9j2%LnZGo}F+bzMbbHw};E;6SOpC9ry61N7fKzw1~ znuuQ|9JoAjZ{Sj6mNw}#ebH}(ES5cH zS@5rX!7?EWW{g>uVjXx1iIAo6gXe3Lu9Ggdg~j-k>*(mliw`YnKD|!j<-XN7UQE2! zIG>qBtn!PWta2TxteyoI8mWiPJeOL{i=tN~<$o%bB{g|{Ih7^#0JfUSk_tIU1L)FMbX5x*dC1>$o8*GSAi+9Q()aWUjexfa{NhgxtgLKe$*Ef!p9 z!r@1RESTY1EX6u-a7TEy7t}{cL83wW_g^XNU(AFE8I*U&}td$080OY zm%fFN8tXbM8NME{{J--ZJCn>3J#6<*_iCoXEwcnM>C zv^Cq$XN2%?LaL3^5yB6fw$A05qCUt-_z6=3;s`%!lq<^=b;~${xzZ||v@4Ea2x&b` zH&lWK0F{>AmuxoEHVe-C!yIC0x=JSz%>!uFB(Wb{uV;? zEK>knEAfNI$?5E3CVm>rNc>RXip2jBxF+I<16LsaMc^8VxiyC}dE&=HzEn)KThUnt z(8+`>mK_sWaJes7CS=>-2ZV81>4Q_sy4cI=CS+T2N=issc|^)B$321nPFuASL34TP z+=Ftj^m2O$DMT9A^Arkh$tt*I!Gah28n+T|^i<_OgFg(EA%CGQuk=|`2VX6Ai!PE8 z*e|v$^p1=-JecK5%bFEft9I`iyJE51rXVsa0eaQNLgCFr!neebt zOYr;EXV#heq|ewz_*tV^4bxu^Sq=FM+wpFnrT4uCLsz6$P?MI0rL!!=JUnSa)T%&WC(W#3u!=NX$3eHF(+mZ`u{X z>&Rjz?hS=oiN6)NA~FA9F9bFb^Uu7Bg2a4V6wUPiIl z0>R62Ew?KinviWn@FI-M$_QR2qutBuCS+R?ya*}lDFiQ*ca@jhLr5VD1g})VEm;LK zf|nJf`gm85u+uBi_ZfqC2g(mH1GFWp%~%|tXQk;P8NrKn(-ZLON3tSjVMSR(lV20? z*!DDprRJ44M$4C7yy*1bEjdS0bJ233GwRI4wjuBSd3ljy-lQ(CvKFzvEM1s~uNEU7 z6S7MDB1}e@;Q8#oStS@DIbxpT$*3WIFyw0_ekgDS;)es*MEpqLio}lvu9bL=t?Usd z9*vl2_gjHIt;A~sS0r8+xF+ID0#_jBL5_q8;*B9+p13P;IbuH9Rt1yYMTSYUi<}X!%ux%x^B1J z{QFE;a1;LAZY_?gFHBmc!R{U9^AzjLZO#4yyNXham%5VtlQzPYjoV_^90nSG-FC&I zI+^X^&YZiGtp5o!8{Gu+XxeP49YB`Z?lM~hvu*#NHENsRglvD0!S~17_MqXP$2h(M z$v2~=z5TWc8t~gR{OYRVx5v1941X)e{n+qBF^>2;vl4>Cn++bat5o}b!?(q_&lvuE zjQhUfAI3Po%JaJz$M=hlKiYMM)N!Wal`-yo!!L<(n+*5FxM9O%G48JnABb^pG5od| z_d&xSiE(_b>`O83yM`Z#ar|>8zm9Q7*^*(IU8QZO8;-x5_DbVk6U%p#;djM2{`HGH zVjS_Gj6=8aMX@ttFHaN=pBLlS8{Qb>h#xQx;vO^jJD;t&e!?=>TMR++a}mkG^n=t8 zC@nLe4nv@ncDqu#Nu{(}rDS!C9cS4vL&#z12-S5ZOC=)-NBVFo2BK%gJUf}E zU^aWMU1bs_es|#V#Pz^g-v)`4waW5f`XFR+tRM*~DSI_KYBH|&^)=UtU+cM+I`O+a zx2jIe8Wu;ZQ?{YjCmE1-6Z0?*T!Hu%v3x9>yfzwvb`vrzquqp*l-=&rO~$2O7R&kC zt~4}gS5cjKIB z|0CpUBId$N`hb{U(}8Owel(QL6Y~>0F%0pYHtsXmJy%+bZnG;okdSrDS&LQ0wVvxh zrVd#J$VkXKA(RUR{Ji zm22=RqNwut;Ol-sIcGXtuqI= zvQ`a~uMaW_`RTspWRfq(p_Q}^-=_gZyRWx_0*ZF$6LC<4bhT$=!@*w?z6OI;{AVS8 zjb%1^-fWcq;F|`|nbI;EX-2vxW-~VV)jnHuosA2vDE--PQ%{s6q<&e${TwTHQB3*= z4Bu(jj16YGSh3DinzAp}M|inW_$|TdIuk=7AK|E{df#U-DAC7_7MuDMhBlshvM)J+ zK_v|XYN0XI>^0g>NK@hG9!y8@M9z_X5{S{8L+rW0Jn%SSB7a60>s}Wf}8I|^BRhoYG)M(qM=CF+-WDT&;4YOry z&5&H>I!g%5NjQ-c#L#@AcF+LVheO z!ifLiv-J&|qwe+&iyv|{0|f0;>y67y!jPA=osjCmgDLbiCLEFEMuSHJMPsqrjChl_ zO!{xV{H>`n?Imxc#L$p!>264^8fdvkecO6|Yw&qqb`NF0$a_mqT6St3Lvu40VdN0f z45viLJW<4eJ+!2FcGIHh)TiejJ#EE_sXZv0%RbHS-xAdfCP*DKMBL%?ik%M+5snUA zp7@x+H4+~ixB~HUfomc@K5#|ilLOaEyv@!B5G(JEnAq+QiT1P-R{~cg9td0$@lfCj z#3O-gB;FCYJn?kka>VQG$UqfLMg&@Po3#u>fslHm;|X_~co*N9Vg<;!kof&xe3|e= zo~jVu@2N5&8-_DzJktbW88lvJgMaR&Zzo*h8{ECj zU{j!K26^D9(vp4nN3#O8LC~XgniUj91jD43VqNBlJ^l=9PmcH%fy)zb3tS^{C2$4e zp};i}?+9FxcrtLU#E%~5nky@vlbCqSNLh*z|0-}r;@k&#|su@OVO&5?SdtBB{iKrdI>zp?ZT!>G#rl39Fv!BIFtg@c za9?R0#D70kV`^8%KTf*Rm+B?Fz*Aj>C8HXm>A5=F^ARIOF}96;jXizR$jLS?jgE`H z_KuhMzGiz7^aWhMH4&c^ zxFYfDz_k*uI>BkFlQt8pjg+`Vd|u#+#1{mviTJ|66^LIFxJKfO0+%O#dEjh@2`0SQ z?yZUCAzmA}Jn_1~H4zX3S5!69Jp5E=RD0D@6km}EH_e&N4z3%MdIfM zu8H`0fh!Q79k@o~7X&U(%s(oJdUM3Dx92A4T^{DAE&5t(8G;WX>&D?bAw{~N&J-)i zcwvAYHtWTg30Vqz$MmlcO z5arLA{G+1ogSmr6Cf{y!PUs5mG?AeeC)l0dgSozgOAek+{@<-6?{ByJB8yXKr^SF&92sRCf6Aq>`P{=-ASrS{;&Lf)j>wR4nFb+?f$Wmzkjem^4-2# zck^HqnOp46(b0Z4G)eF;{^d;G!6q`_v?9yo&TcmV$vu)3N8&NNag-D~SY+}~Mu%F+ zL{E2~7_Wug33ksbO@e=XFo+}bVk>e&Fprv#{2qTFQ6(1l$lvSL2?LNE|A3u$0uub| zZlSly{K3S9J7k{l6@~Cd?%0!^O?*XX7_r>0=50*A(CAPLnRD$h24p}Gr7@ZMf}5t*VzrT zFq7A(Y9aHQj9SROAz2HFH_fkw$+so*zt4yd%+Jr{2aOJfB=dmXiT52jE|8ObM}Cgc1Qba&P{OSuC#kz+^iA& z`!&{AOkSU=h0JT`)iPHX4aglzl_GPi-N72$E&NFwP8A{ZvD6(hpSC-BGhPu&;D1<; zckZ$rPm>&TqGZU!d-uhqV0eWbymNnC3eH60d3bM$Z4A@8@Xkq=!<+uuMm)!^W_l*i zGCDXUnU~w0q|=e_wEJ;~CAY=yrS;^UVasu%>!M%|-q^XI2;SizYf4wbJGf*OgQh&dOZf^~hHA09RP8}O zan1Ob*T}`xj+IQREpO7X&ZN>WGG(b@VV;IdS2Xfob``?}8+}HsIavxaAC2?m)iNgyr`0mS&VRCM8D%)mRmei-zQOy* zc3O!_;DJ!G>WpXQ$$mRyp3}3_jL3`*SvmVnRsKB*&V39N;ZoPLg&&Z{EM32^u9Pj1=vl z`I(>##qwu(%l)ZCJa#ghxkP?7y3Vmisg6wwbZpYhTg|-V-poBUgR^!$3P%-q0g_3Y z8qw?;JN3EVuAq{K51@G7u+H|Ou*4VlGjWNLRtb}3qfwl&Z+=cD2SZNoiMV6YirC+u zwf=@g_S!>6EkOg%tTXj+$jBw-zgpN=flSca5cm{~O8e4!DvC!1R9s1F&ppn(R#0^% znV{y-gpiGJO=F5aDbMw-No=ADWP(kEKtg)1=40Y7m|)PHXVR`Rbfx+-`>>CbR{IWTweLtnM*9w@CJU`7qkV_>XSDA~Lq_`!r`q=hYu8P_ zeLajL?+BTI?Mac2d?kHDSnJb*tvT}d4e4*^@{Q0vG1FmC}?fdV{O;qP&zA@Vg zKW@|s(QI_dwbAMB=Sx=B`M`*y9IrZYcH|fYMUzlfET^a^4{?wy*=(wFvsb5|>f9SB z!uyQEZ%5_oOq}gQLO)@%QJRm5pniW^{rS$9=pwA-ke=sUj8=rwRW7~*rcYvO=z02`lcn=Y$u4Zn@6mUWh7@e zI+llI4APGMYg3HpD~@F-;OT>7lWHfsB4d)c-E7b2dze=#le-pBNx>||M~REE{~`{O zN|eMi5XnXyq?ZG4v4841alD5QbA~?B^6g%WE<#oueCQs_^!<>TkWX&mBdm3acYqQhEfqv24fP!p%}34|ZkZI8 z;g;_(!-NHT4`ct`eu3VTtUFoicr1XpRGW#GQv#RxiQ5ZF^XAa=1a`&z35ue*_sDi& z?p!|ZJ)uPSPoCOJ_ywa*i1tO7)WS0E%f|D0INtpv%C(j~&57==F@n5#3RQk znk&6GI?V})=VhK?l}b{@409*-gG*AW8>~|F0O28{G(I!&vyhMQv3Ncvf@1w?#ZsMaEaK8C~%!F_8s+0&>Ybc-ejR7mf z{bEM1CWU4AMuTnNp0F!o7?ru9o{*^Te6REg{Qg*Z}C(q z`Od;$=%wd`QiK$k(fz#D>`QeKUSt%;`QiQDmf(9H_%wr%yL!!+wAofG$FqryS@VsS zg>o{ouwVI9q-c?F;NP~h^!Zw*`{@lAm%5WhWeO~mgAT#@)a zfoml``7PLDc>d#zaVf$;&TGmM0{@G3dGHUYb0J3xIA%d;Bv$Vo)uFt z*}=5v-PST3#}iU-^aJ5)6YsuFV2TxFbl7bs_QQ6ypABL1Q@++N!q3dl$t0D6<2G1( zo@Q52dkh9mx{?j0CLcHX5|dcx*S#8j6khPc`;x-5qS^ON!lPbN53O^B*$k5bg|>L% zsjU?SJ>&&-6H+#o@<$d?`bA!PHz6z3e90=6OxlK(KGzE?Q9kW~zNIMIBcr=niYh#{ zHnS8PfX@aADd?%Ug~DEXnrmfD@k_kfOGyhP>w^kxZs@G;WT|em*R;3WHkJx?rM~fJ zscU?x{&cC-LWHIMd+lN=)^$vDZDe}{Qh9Hv{!ZJLY2nuExe0x%{H&|6~_gZule!x?edkj9{scypOd$m&A%ExV- z#)i&_x!GSBCns4Qr-izziBj-*{>)rxPr6(=qg?t6G?t5LnJkwvn%7#h`+W2J(rxPt z+Bw8h*ZNZBbgA+}rDE}hL+CHqk#+5`x{kr=zPUH4Ah4eTsSZ{ugsdYbAgSSctAm0O zA_zlM`v~9YTfdF)Mx)e|eZt42ZB%b-ppxpL&ZJtb@UMM^-GqPVsqJ?eyw_9Rguy`D z(;B44(g9QMeRh=<81WNl z|8;|`Fl$R-S(<&RF2Y_<^%HJ2O83J|d@k@yvXD-ibwu8DYC;EKcpfommx=NZld*aaMk zn0T*|vI`)7U*L+we;>Fe;tvF_K>WeLH4@(zxIFRUz~zWb&xt9R>@8Y!ueA)j07BM- zBLc$PO}ra*OtFHDvjmENmlt0qWGU=E@0?4jRki%I9R_r|w$xhg5i7OC)WrVaWP_*L z)wUr_E)O|BQ*cUr!LBHLpTQs4bqSt*ompqi@(!kD^* z)JwMJbJUFLD9Hr1L6wA5%&E)Ng9WD%W|F6%?jKCeqs>4Px@b!(hcK8_4OFr|DVeM= zD-iy@)%Z!fN}e98eJFI3Yee{$*{RertaJ6Xp%u3@P`hswT>khy+K*<5-%F|+zZYtD z=x6|=iJie$>zmwC0iG}m26z> zRHAHi{Iuq{*`3R||=3^r0?E7G;AIw)Ib)^>1^wPHyvf}Vm zv&S-xhRlRCUdWuRiF(C`%|cn|vO0r2S*DCdG^>gVt}q_|9G>&f9?9Nhcd_6i{dE{C}Wi%fXL9TsCju+KKc&?|m zl?@Jis)z8yo=QcnE1whTe}i_FT@vwd;PS+yfomk*8Mp%RSm2t7CjwU_zB+KN#3!zB zI_VD;F>#8KvXUh}HE>1Z#=tcZpBA_R@#%qUBt9c>dEzqzmm}U_oGR#a4gb=jcUsG^ zk|ktY(1wVZGIc00(Hts`h+B<=JVNRr@{<3h)hJVqZ+Ol62w92SXEJr3ud+qkOt3>VClfC<>n%m^EM0Mb1Jg8yN=UYX z9l|y*Mw^rW(PV6ue7mtw9@_9kZ&s*%Xi3_*Pm3GZ@+>5j6=!U;s2l4&B~h2wK&+(-ygv~~2KxX1^Lq0-QtofMuc*vL3 zf}MD_&(cG9fv5U=4UTxKhww9=>QBnh!~?i;$xM+TM^Fy8mMGzi3xX{)7)2)eu$hZD4}tI9m1_OIO_6Kq98i zEnb^g)wiUozT4z~!&lu!$l6f#{R>rne^%9>&Z_#;sj8EmoAFF1ou!n~)LXOayERoG zePq9PoZO@J*IR;)gXay8*3&}?WYWtiZf9@`!f9W_?jws>!=aFm@NhgIEB%o7R}@~T zQnmrXmGaqwSP16m&j`V9wyNLaL&#HYH%qb+2o;3?{q|58)p%;kC+mX>wBCEodY}kt zP%JHvEaFcutXjDne?{lYqsc_UE5g4Z#~sd_@74UlQAZSy)ONP)JgL(5fscY zctK0x(ToKRH|G4pWXUR$ik`caqnE)2~V|&8^2C*2dXaeSO`8Q~`h9=*S`}@$X)VZV#X5glaxkews}}N-k6>R}dI? zl+UFLD2n2=k`YH(iuS->jPQSM8VdLAjQ$5rrm+8B`+U`AVoXxB$_aj!?gu8Gf9Vl9uPDj0^-0K z`WzED83Ysom5=~oNOFRr7Zfzns1eYPiW(HI5m7;-25|tD*NA$>i$hSk;JsXph=B9E zs_Xgf)u~-4#OwXuFMp(d`{}jUT6?HnyQ+sXFRm5MX=?prZKoEoI#vp#J3Ngq2_JO{ zWG2{CgjzA%4yU8FbxiQsB<_(efiDTteDI}`+BeD+Zg)G7)Z2CxCi#|}oEcu*%@=be zi{pd$KJc_4&Amu?Rgn6?dxI3Mc0bZfbYsa56%z)ybYEUHDmk4o`Kv>&e8>h=lAPs;3bpgm38F0s3VDk2Mayg z2>(f`*yb3dmJ-=KcC@+}+NK8V$n}o0T`qq-)DE{zr%%<3DPbtK7^|xK$aN`L^w?5Q5Fw`2R77KI97xk#+ zj-v}FCOFPMIHorXk-p?HzbfSVU@^gQnkx2rt6DL&4yVQLD0Z`rG;xm$aeKj+2WcMI zE6M&eUbRKxPPYR|y=_Nfv)hp~Q{ECO=1LZ)gj#*zP>=>L7rre>ec+FS6z#O>M$#y` ztBFnK7Bl4P-f>FCwdONpwlOU}r_p2+W6LJj??34!lei>Z6E3vT;<{eecZXViAimp+ z3*LX`b|3-UcEymTD-%K42-q@2J+_x7#aGYh>>w*r*uFMXiw4*Q1;o+zw*_babX$rk zSXOk(m0|q)K!$XCmbBk#%qDAdTe`82mNaTj3AF~u#|J4oPpI`zcL$CLKi+=UKnowz zde7{$LbmL7od=&4cJCv#Vgovy7H3)slCWixW(;2 zn$xzU@O!r_wxi_QLKa7dT7BTjK^lI&aA}bGz>PtQ_WpD&gPh&(#Qhh4PN!IJ`%ZFd zjST}iqXn-Go7#bo3Q5YQKryG1M_M@FQMK*9VC6CjhXwERz!|~LE@u>ObUTo2+9OE8 zQ!BY=j!r-(?m@wOANc$r4G#-nAEZ8TeUPFNyjL%IMnm7$BI9@Q(S1T(Yi?XCy6DBV z=Et?7rJXeHS6bPlE%*nnCGd}3tHBStmcl=Atq%XxwFdlskuG z!?hZ`(zOI$<60H|khFFW7ME9se7KRnV$ak-I>Ihp;5ll4_Q-3nMQMpts|%8&)dg26 zjl3=;k~70%YQNQNV36!io``gdNwK5oWSFM59jN0Dm4WOpnNd7M^3IuTe4sO{Ar}*6VLycb?&_*1mSGAYZO*S;;ANm-=! zUy$j{hgW~J4NtuG$mj|2(r-sM;ibQ9BNDIerU}i6`5%JemHlP0N7kzB<<3U&;?XiH z>mFWX^(q+%USiVkYJZ%wGfeS(Va8%#{u4AstFj*;D%!NasykXZrg__l!pqgm?H?Fg z*7*ZNyz(nq*i9Wn!>V0!pGQWVbavALauSv7$9U=75UUToB1rQ&CvFH*ANai>%?HWb zzot^06aGrE%ibq(Z%pqx^ncM|V>t+2z9kUG?{D+x&CU#lh zQlU^eG8Z#L_(js%hQ;iO@Sh>CLGS?uuz>`hl$2k?DG{J#tN#nR{ax@iKdu$+L!Tw< z{dCNpyx%SUe()4+m0zTn=7nm@Cc#TWwRzVHSGrjZ-Wbg0?xJqnPepb~* zLx>mu9t3sxlw&p>;mh@+X$ic-wJQ86*AiiLm>|X41LD%!11@(fa70qxL`sA#naG6h z5@aoc$GMik-LBPOhQ;cp@OZbY!!*V08u0FJ*8~4bnw{92D-<5?FogfZwFdmCYjyZP zT}$D|T&uyqaV>$jxK@Q3^LBz1#%m&2>w4e`t~KDDU8}>px|YI;Yc+VHYYDuEYjnO+ z_QQ!nn@=EpXmbMmt*r9NLy5MSAxOyb6N#`yvbS!*AB8;Tf`rL@HCvSE1Y1(T&Y;Z} zL5jztLxet%NVfd~36llw3qctnGXy(>_Kg~p=GpEIB$D0#ft^A7Lr{j+48hKz{ZUY! zBr-v5_k(Aqgh?R2>|IU!#eowiNA6NhpG$PKDFQB$R6fjc#b#N>c&HAO+w()jUJwWN zb-<^i_g`NpdyKX_(-o@tCLOai4!*{<1b&-qHTWH_rSSV*tHV2L@yymZm<83eIy~O( zQg|oVYVaMRQ6o@!Mb(n*@`k5yplHoT8WVc|nOdW(aa!Fn1tX zl+UR+k0yB#CZ9l*rmBWr`M}Ny@dVmI6>w`ehOw_+^5CdXyjEz~Khwrpa@wb3Hoove z*HUuB)xddX4+FAUNki1YH{!2Rq{u?e0Nq#+QWHWpx~`*4Jr>;fK#@C-h5`*C0s%A3>d`^%CL7bO2J9gj1eP_kd z+lY1cu`#8{M$0Z*AjyoaT(rDJp))|dljPN@9i0Oo=vo3F`O#X^I$#a2nsn>DxCtYeiD18a|{$<}MJn$g z;bGV6@LbnYc)n{j_|>i@@R_bv;pMJ1M(g+Mm9L%kAWgQ@6r?5jSx@N;UKb>7s|%7% zUYF9j%FW_}q+7B)EL5abAz~9`(Cl(YUVjf(1K`*Yu1N+SF51HrjvleA7)Xq)HGM5g zG~WzC!sLdOE)99~f#i`J7RTuwY76trmZCc(G4v+k9$zLE9c@yr`*qA#i-*Mrg{-2r zD6Tf6mCF1G9m^J;6?*MW!NwjXh_7}nfv$ai1aSYLpIu^t2OlvUn6l<;42ddKdYxTjX;E8cD{RHQ3H?v2*J zif`Ak>3jMg?wcfF!)!lCGdZ^R)ZgLErlO-tq%Xz zwFZ1vcb<{$?KV{?oGmfC;=r$Qtqz~#S_+@*S`9wmwFF-1S{44*jvdL2)>C`yCf+6y zNRHOO;01DTRv=OGc}0nsC1dkf_1AYp#NoJBwB&Wmn&h(O?PO^K!Bez_ogSIYBiKhm zTjmuzWr1qFJ2;MJ7%$N?|41hl!);WU@9CJeZGUAqBV-x1jd!s22`0^==O4?Xdx0H zx(khP_Sy)q6Na4m&z zajgdbt7{2-hig^%G1nUKf4f$Pf8$yTZ*i>#KkixrKkZr-{=VKB&DuL!zyG)T$rcQd z=Gi3xyiMNC3jBpT|Xq~PwXX$9qRhI~_a4Ak|M(YN>OgCgn6cc?!L-W@#L<1n*kza2q zO$nVdz<7MkC3?ORG8;Hpc&tm{+k@0c{W-_v%);2W41MbA8{># zf8$yWevaP%x4J2ux>ketb1i}Eu2tcUuBGtTT&uxfcP)W8xmJZ&@07PX%Mbp5Yc=?T zt|jnCTvM-m57KvkRG--S3ese|4uVsaS$+yrqAg|!-YY|M2Yzd-x|GP<>Vh9ux>gsY z1$kW0KBqq@cgDl6ZKOt*nnXl;rQ`}oEn4x9H0WAoO)LJH29YX0%~!F_>lN;H?=0}M zlFBa6ukU;IAl0qSAfCz_M9=6RyZuHW ztaUKc5?GTZ(`vBN$g~tz`k7XTcTq6Y8t^37_(R#1KPv&dSy;Izg}+F&%02L3U2DKR zOUVMmV>)ipVV<>^T@BvB?Gm`#wJLm{cI@p0>A~W0ssuX`L44W=IzU|JqeJO71u#SK zn?V``NyDs)!DmQ#aY&*Ue7hw39^;xW3KxbJt$O-A3fF~@y&&1ND;I;}>_d7X`|cM{ zhCb*+RjgL|l$0;&XwRoWs@Zq1u0EgM`HY67EmHWNM5_!Q=8d}g{9@EsN;p@?Y)9}H zakri`+gZdLB{z0FhUUrYmqVKxt-HkkM@Osr8{rc!ou(ug>zD<-U;N7sjm(c%3o^Tx ziRXk-8CW5_p~I}$P9A>qpxhq1foCZ(`&(HfEecnKY@;pNJyG`zGbGcLylq5y%I9rd zJnlNZ{Ql6!#Y)-J-A_GS51ro&zBY9Jg_GbV(z+`)W4otKqTDfKu05Z$jtg-woCLp8 z8V)Ekp=@?tdp?80fV4%=IVUprt{WooYZb&Umqk}4SJ2qeFpka-j)r4L(Zhk*(EyH) z3XTS1N703{c$U~#0XClBTBsfv(b4wd_h>l&uH!`eRmf^Oy_z1-GksNM>V#PnCbxJn zNoSVX6#I6Q=E?WM6kk$>&km0VmL%}&T&u#@xt72yU8}-l!may~WVAeXR6SeOK|Xn*N) z%h+PJZLyedw>{__oVG=C$%8$mVZx(*gc5(Daq-W%BW8DhGdHH^6mMXlmBL(;>*HZXu*Q)S$T}!>|a>DEji|+Fz>{68 z!_Rgtg`eYE4c^bS1g^VQg*UnuKfF<%PwQxd0+No+DR8Ph<%2>A|0U=2soGo*=$M_; zKNJ5($C9zUNiW?NOoqXYK^i3fvC69C0nnAQz9!V_1Fs8G6TBfvec&g86v90>gc}5( zC&_-!`#Y60Rd{o->jPUsiXPvdu0S5JpZ4M1R-6~hfjjCio@QfZvUiBpTQp(7?vhD1 z>EW-smcaMAR)hD^Et1tu;eB1J!IND};MBD$e5*g(NJq<;CzLixLBiPF1D`GL`6Q); z|B^|%NzEfYn~-s>=#l(-CH!emyb5pLDQ|*xP69vbS`|LRZ-o=M$F(YanQIBW!nG=V zmum@pk84$UyzWu6{NTj3D%|H<0?&4>3cugA1YYY}6@JLI1b)=DDtyqc-hXhzwJLm} zYYBX*YgPD8*AjT6YgKs6ZXOq|x>ki>>RJN#x>kj+b1i}2;aU~`u4@Ur$+arHyEbpx zxWN-$(>(UmhdKIr%~3mXK&GXg58y+Zq4|kJiFs*;;7m=a+>jCz(+t7Ow=$%}%rryr zt6LdTVrrTpI6<=|4^4@=X@+3`R)&V`IckO=Q#AKTiAidPAagV~ zq{J*WLy!rZ8~S9;Db;kI+A*!+gIr7CLtLxDN4l26N4ZvqchMs{JDnQvuCCSL#I+Qj z=vob)>TthnDcp3e1`oNGz^`(x3SYIC#~rQTk5fO{QUTI6 zHijTA$;XfqZ81ZT(77Qc5;4Qk@|YR&Xo7UT?ejn)XYQLVO7xW(f<(>@DR~~zbB5y; z|Fn=tFUYj8eF6~~F_U87(bi#(eA0^lCk-MfL-_w>G*|4NkMDIlX8ZqNiXYd}zE2o% zA``UH8rmc0OLR1|OEiC1gn1ml)w#1=>=#_kXu=@#t)fa~z=aJ;$ilwNcAv$F=w-Oz2N)tyAr6uE4*RW~S1S*NfSv4X(RZg1dq+E(p>9h^O*4E>wk!bj$`5ey3{*ywbHOFMO?#jpYSWtvm@{ zUESdv{*-G8yxz4a34E=UjU@q6tvm_Y+bHM%vYvqTyds5mcs9Ftp?NTEJ1jc+g0J4rL_Z#qr<*Ztm{C0+PV$mGVe`F z*Lz)%m{vCmC4n&ZMHi6P+AaemMi#NzqC^<03wp$%XO7rML>y-B`%2vR72W5C&m5tj z2#l8Pfxyn7{Ut&Bi$Se!G2#&tj?^(*e^^_XNF}?^xLW*sp6lh3Uk9)$0rF)wd)KI# z&}St)tYgVeA~xxJW-rarOnwyt4T2s!N^gU#zpP`{Uw4bYspHtnrDIwYzT;vgy4dck zx5}pLXn%kLq>FZ}T)JTOxM^dex((GiLPtA&t1w^q%T8&SuXveOgJ*f&6h6_lI{c(- z4frY7>hK?3OW{AeR)hcQS^~3pX6=CcwTPP5P(OwP?Oz~YHoZW;#%Sk1n95VW;!wiB z83w9FD1+0lM#K>5YBQ#y6vBcOf7Sv(#s|D7pLSqvrf}2%VeQuiEEtBv0G5{WlY% zb77f!=iNG%?V|3`YY*sX3k$jMtw58;Yo0JeN|v7mGI^s<&MM6JtZc%j@Mk;hijx3e z*T}{uF}OBJ1K{mJ8U%5k&+F0Lza>;`f;R+d2*juTK@_mleaR=<x=yu2rH|Lfqs2@=MJ8srmawl08#F)Oe$ z;^>`oe~8!z62>|j+$l6@7$l5Yft?XczH%-fGlH){aAuHt!IuVU5Ii+Vz2K{YG#E`T zy>y|D+33UXbS;HfyB3Z90=;&zjyA5~H9;Bx-yNhu5a;EikNe9)#U^;Uq^x4IMG3bh z8%?uS5k)CYE^8V}-H`S_5IS+Bx3xt746bgc&e!L<~A(zP1=lxqoG8JCZ9 z78icPwG{q?Yc=>u*Alq0Lx(@{uUt#vhh3|||KVB!Z*i>(pXeVVNa2^bR)bG+ErEMo ztHSScErs9hS`A+9S^}?etqRZ5Jz%yL!pFN-gHLcRflqO*3U6^Og@5N-4Sw9U1b*7J zDtw^M$1K0%Si@FO@W|vT$>yMTxJVn!0gJi_#XiUE9?fr(S=dj^-5PQ+Byi zN;idJ%A8VSxXjj^@=>ilH2}L;F4R`9x?sxUM=RY^TfD@Fv-YsBz45Fz81W(_Kgqn? z-we%njlqgnnF)Iptg;WZz0N{5l?@ZYntG!oKDT5NSP4U&btxt0M&6|_m(5#swCdpc zt*TRE#^lwDlZ8H^A@+&qeRK{pGs?EW4cVNiqn*p(OC;qJo6@;%2%fizG~X;8XlVDhd1w*Q)SqT}wvu zf1f7?;?mB4@a6JkV*wH*9}7x^ELl4)(kFSA>R2}R6}?8>e%Rp*{)UL$Mpoi?3zgX->r7p z*ny;NYc=?6dC!NF68V@RNa);<5{Z~$aU7N@KK*B7ihH`iB=9WdVGlcF-_iBxR{5sS z?b#upvZC8eiXBBy7@v@%{q>;RI_m&oJxINLisqLt9jAOx3V9EnEIchpy=3sZAPt@? zydg-v3pJX2n8nuLVrP<6O|`lzN3@7XkW72#diE`R`S5!28*OpCqe|)>wH@(hl+=qK z$C4A%p?qeH*19u&TyW&`Y1F=CfU^Z@SRUL{AD*_=O?+4LdQX7S-$nv)tv+gPE7*4w zgim_eG@;ryf>G;-A;mrrM>|#)=1*~Px2-HV7knnhvnRHRN4#ibf5G5I(R3;r*|aFm zf!HJ(a7;LTvjLx^lYnN}CZ*{4aGjRt>u9^3m1A0zE^zhs`1yCqSXtN>^mi3x8!VWoNZDl-=DL>IQMY(JP=Z}Oz>|YC1mY>b zf);&H#(`Z3!On{D{nS3H$^0!jM;6HBOdYefz~{P_z!$hygBQD&!b@DM!yk670e{4` zI{Z=BQuyPp)!>_5OW;qq7LCaQy>^9;HYOmUZL`SKOdfDHmV>TV(&%2huce+-Czvx;D^Y*9ttHT@Jt^t43wI2A`u3WUw4{WYbI8LHD z?15kCS_7WtS{**YwG=+lwHkbqYYE)zS`}U{t(~A65DxU{!%}S0gZQ*BVS^{jRX*t{ z5uoJT+Ohj4?x|&8JY7E$@)5-K`l$E)@J81FNFrHUeJx4^*v34pBNW-ANQ#cPKqW$rObtB!g zCYJ<_-p<@Xo~P(I-u@PO*XnVLDwA7Ce9PJPn;^fbYHQ4YQBggRR2J{Ndfejr>Ty#> z9yL$s)KV{FrFAT*3$GF|93ITPhR| zmY5mBhq%^&`69O2)#1b4E`?{fR)c4{mcU24R)yawt)1X#J^D?x*49-JpSE0rxXjm8 zN(3lbR~ayT+Png(WeeE4Xd$BB2SZwYAl+nh9wd=`U8O_-GkoS&_m`vCZF_Y@AUCru_QWk?bLCzg$5)m= zW~XtsIwEb-OEz}k4`OSi2izK*7$)GV)g#56tiM)A?H(s5d+3<0dGO>AV4xv9#wFap zD4Yn5)>UHfhUm)lRdq0xJTxss1nl6N!Y zKO?+NbfvVCjlxR3^sZ2CNflo0S^~eE*&&}=w(hJP zL*aCZ*}@2);aUTp>slS2?^+7K+O-;dmTL*jyJ8kM{3=EFjvWb7*imAZAY65=0Z(wP z4)5$*3h(M#4NhE3;N4w|?)Vs8etgyzX^{T1Z5epBnx8Mylom_1x*$!lx*%EPb&HEd zoJW&92$NN8wkQ$FmJYBpLVOST70sjjbhI5A__rX zK**pMBoq5#lFeNd7%p4=;>**g<%D=yk8a_uWX)&$Ol@%>J|L63bj+$1ZSIik%fooi zej@T5eK&_+<>2k&lJ^2+ZRt(-QbOZdZe+yOzRr*Xr;= zt~KDpUF(5YO0)HKQ-uN_O3#)r_+4JP0rMRVv#Z1Jb-NT^<5~^A-n9hgNlDf*dN~~E zyi=vv5(E<3_GloU%9o(nR})`UEZu>{_4-o13P`qj!uy0sWTaXlFc_J#K_LGD^=~i6I^x_GDX_!$`Vk8BKzHTR%4L-) zEy^^)5{d7J{}Kh6UkqX^doe^c4>99_C`iez`Zv`{n{+JOEPPzA-O*uF%)hK2Pur-! zy*B*B-gpgG$qm`J)H6Ktw4Dgp(W7feWEKuI_eW}q)dT-slD&;M(xULF+XWv2T1WTW zbS-v@NyS?9MQ2}cy`QVcF+eq*mZJnTBDc*HJRx4y%-P=cBXCaqJX>n zOxvtsaj*Epe!Ewdebl`~FWFE|iAn!Y2e-4-jl8#G*PAMQs$MfKfnVub4c=AHMa(XRcXO=<@9tUx zPjoHXQj*&u#k3ntkZRe&9$#N>QH3vtWE(Ahka!mbEE(kcWd8k*YQ=FI)N8cURt1op zk}Rib(^rqn4wLN-glO;y#GhQUhJk;S|Mp)&q~JL>i}`#__B3xhn}z4UQ9ZtaE4Fk8 z+rrJ5-YT|sVzISmQ%n+9pAXT7Ksv3fa&fdkP>tcV+kKE~?c3O5xDkcHxTH^b@4!uF z7rkJ@+XvNl`!6Xum**)Sle6qxKD}ULIblv$cmNdodO|z&#r8uQlcWCMJMRD7u-Kkd z6Mt&Q83!NYS^^*DS`B`#YbkuVYjv2viDfH71KvejBh%{eZmy;9?yl9~JzNWa25XXQ z(aJ$vPgibsf`L>kUpe?|V;>BSYP9|)=67{V_Ah1Civ7P{ZZ>qdF52|yHQH_aIgq@c zd3E6%O83c`y?+7nMJ4<8^zs%3Z&!2kk?|u>A{_PVA{2 zCpbLawFExEwHjP^Erog8Hd}yT-nPvaD)^25kiG}Lz_kW^p=)(`v1=)Ov1>JWiE9ab zscZ3qruLkzqwVQIs+HcmrLvzD>NP>?l`n);qW-ug?t ztu6HyKVkct8iR{$8Xuvg$j6e4-*7IgSX@m$qDRI**0EYyb&GA|kBGPMCn}ATLf`g+ z^oC_|OLX^Fljn28!|8b-!R`0ouO8{9L@M^!5IihAG4BQ6F3Ij3m$xW<-tCGFoviS@ zL1)(*kihnv{g%eGDrKUZDfr?LpbsSW*vf@viA0YgN#v@~AHyJl^F(?kQzp7yiow%D zBK@EzvZySP{?U5m(vV0mNMQ9yLYe5cN`mKwM4F%{Vt?A4f)7n}t=wG+5XGLzfg6JN z=mxZ>Frbqw%g3x9Q~mos%ksn2iz-tuu1w9puh(L%nR?T(&WF5vT3IEGFHop@dxBuQ zt(w%hTs0d}&F*%tQ)4Gen40gFhhriS)2d|B_Oi9Z+`D`+R-8KrWZ!qpx@w_XePLdl zdZEgyhdoo>>MhUfjpY7EsfT^PMlY_HyP0~S{3sswLt)hCd{4NS7Cal}JlADPc~K=B zXgR>@5LxeswWh|@j#{dMDJ$v$RKYY<-MVkEKT@F%sa$N^u%&r}R;?K6o-sM^qlJ~J z7n0!A#g!?RZHr2LBfHUAd8q;woaFi9fts&S_@g^Lbk@w6$&Kf&UEzXj$(!uAQQE0v zp1H`|(&=ou#xC@a%A9_AkkT&cbVHD>b1JS?uh&_?0=1t#ZZ+3k?X(u=hpd}zHpo#6 zQx?~)t1#iWs)Ffz6irofTb(k6D45=$Du?8W{n}*I2E(C{EF1OBEl#j_Q(Y+mMf0-xy z<2;d@;@)uwy8zieEBnWn`j!&JyY{0cPucLvw%DGhgH*QdOV-fnNgGuM71wU+yIK^^ zmRQX`GGafI*40A6tv!X#-0IchQiXGpv3=pCEefo$_HoAc+R#G4clNZuuP5GpU!bhk zdRG+#FV;)f2a`dNTJ|p0!tN_7Q)f&btulWe+&=!C-3QE=enrWR^(z#Cjw!pbW*}#W zYB``maV0Jb5YPU;a{!B@B=M2Bi z?HX`veBO&@*8{J0tpR`7wK{y0YbpFO*J|)O*An<<*P=UT`s5qR*Y2D_ueNGdarmkB z;ZUs!Qmy>PnTnH?iQPDZRJ6Oo_+wVoJ1Nxb2RrJ;@6NtZ_84bVZ-x5fgF0Hk_~XhS zRLjna$%PM|rGFD)-6!IJZ9}H42=qZ#uT_7I6jA8eL;OB#@KJbf@viHf`+kh6z-Fl_ley7E*^exIi zlfGN!BD+dYy{s~Iq%y^}cr9KayS;I_EZbZM)2Xeonh$&EXphCg{e7ye9HDTS#BSR^ zWr5CC`O;9o59DVt?8{3avv5NDlj?aJ(XI}j7q#11JpK6lIa6deDg0*5s+A+%lk+x( zeBL0do$NymGp5^%*|%MaE;&(HTsjgTxE8hs@7w*YN$M0t0h}Fk76d;al zt(KeTO&?_kz-(c**)wC1akRb!e;Fpw86bbT+pNHsg>gBf*!tM_>9Ow;N6|x)o0JK) zx1HoJA)|h98%h38*B|P!2HMUCWJGpok4Uufq2}kc;@QKqt`-HZ6Tb05!K+=cZJbBh z_u!l5zrF9FfCt<6tjX?)qUri0WmE|xAH84lpiKT0mg_-~TBGl8sQhzPwl6hou>DQh z?&ec6q4j0E8?F;y2)Q&thN2?^61}i%9z5&J_M4o=*}GoT=r$d*jSYN?M4Xf^c6q7e@s4p8+`SGG;Bg;seOE6 zY5TJiXgGc5_df|hI@_JuZW`sIbS!y0ZjZ<$dJK!n-ZI_A8*^F7W$E{HgUriLF8b$B z*j9Q$x~C8YnO@tY_$h(1RAwoK6GAHXSs?K%T}$9z*J^OTYbiY7S{-h>)_~7&tp`3J z{DO#m{++^s60`dZm_L7RS_3}V?dtHMuBGsEU8}+TJ$Lh$!2CFqY2nY|@nbXX59m|q zb%#B0pKA?xz_mI&=voTD%C#Ci$F&4r;93=4FRh)RFIzb=U$IHXi;Hj4uzQCoT^R;rsl(VItT799`5X~i9v$|2QdJjY&qMs$-p7@N`?+c0B zP1J^wC2GY7bj(^)|n>y_%JneQM?Q8ohHo;OMbMN2ijmNkFgEZh{A>bg`(SXgN0l#)Tup_a} zU2$TA#l)-u@n>1%)S3q?)L|iHFGy;3KS$4!g-LM^&0-E_^~|H&Pv^YCGXOn<{y2mF zID`H;gXm6Ug;IKlj@haU-{o2gf5WwCleR*yt<%vKCh$u^8UVi@q(Knp<@>f3s(?@H zPq4FMyh*!374HZUqg7y&UbTuPy6rSK(4c^(c1m4B9D*SS3?F7|;aG*!`8k0*l z8Ni_+4T0`z)%xYZhah&<#1-|*9~1sj4rr`BjVR`BQZd|erNEprqO-AbHa@hu7bJJ{|DCAbF0!Ygw%CFl_0~o8-mQ9{(lNWv@C}D!!Y700gY$#b z3tkYU`QVx$^?p$Jl_1UkmGHk@D)vILHCa}tDnq7#-3XK=Uv$OyzGy+_Do%Z{m{ev~ zbVa}HsKm=`&Qz8c>S*HtGEcfH%W81PT-dOj!ikz7Ru}9T!wu0Gl9%`K8O7$8RT%d^kOA4PvMBpTqP;!7 za&q^y6=Ndz)+I%^e8uDWp&h;8@shHSYR}9bK~8(R>+8~Ji+z5p*oKmCA@^!X`gP3K zdw9sT1b&rkHTVp@$7FR=c-XZXJkPZRUf^04KF_tZ*eT?@Sb5lL3KH6O_uzba%CDo8 z@LzHp5W8>UennM9>{dD+m>Q2`fb-R7QG-7%DS{zi_iM=+2FF}ZJ|6a(lI*^;EP;K;LBXA!B@DJ z!b@GN!^>Q2!2A%4#qELlIF)THHdiR@tw)}jAzX8<0q^5l9iHr33QuvZ2B)qi@P4jU z;jc++Cs^!tdUUl~YiBCx^-A6;q~3=^y(UP0wvK_MlAnT<2vD-%?WRxb&?h!usI@@N zG3hS^}?htqR}oT1tM!WWM@Zl!#EWj6S3|kLj2VCHz#-X0!r_EuC1xkvRhij>rv+!)E37D;;f` zfDcQ`=R~L>*rHdT@QUCcwpr26i1xoRVMlH!l9<0ko1I87KiZI;H1H8#H-Y)CuGv*# zzNeGbg-_PyIg0_aH_Gb5O}9&7zQB{!g%`M86~5OmgQ@z<56XSAj@IKKO|kP0 zyv+&S*l59bhP-;&R2>p7oxLv?daAwN$vG`moSDJVz;-n7LOH%Y#ERaVicO-YZhYSD zqrpoP#PN=m#p}Der)|{v;@R`*It=X{??a4S>&)lut@ZN4p{T;;jrRkx0qBjPq!c$3DUR5J==K zk7kP!eG13ul&iaonfFI^O>+21S|-{@Kb zuXU|DnlHZfVWR|6-TD;7Q$9*XU%Yx#M?CmDt|jm$*P^`eb+>FRFOce%7l^0wym<9{ z9r56UweicAZkUg^XJ-z~H%u}+_!O^Og+JM9i?52W72-?L8~36|uc%g|(2h_pI>y<;40Ug|Bz52H)sf0cyLU`uF9&&X1(HkTgPmG;JI3^Ol!bwyfZua{T+729>o7+ zp*@2je@xi=9h@gm`2bPEf5`yF?wh#hR>GddfH=$th?2V>wRe6NvhM@uC{=sU3&deQ zK$P5l^t5HVe7rdL8lu*jE}bpB%%x&4uhmQZN#JaB;B|V+8~0zb}R5dCFK)<5+O?_04*nsJstu1QI34HDG|vGanJ9)m;@3r zuUl+ps%!Rs9XA9p&nL6)hWXj*Y*^qMylw*X9iPk&-q2w;S{^TwjdeFjXzMcYJ+jLC zmJ+ee5WI0KLrNr4G6>|gt02oCKHjwyKE<^v{2JF%VRV=x#o7rT9Hb%e1W9>2DV-V& z2SGxXJl&co>*GSL0UUX)=yI`8){At^`T@SgwFJK0wHkbut_fB*h0k`a2A}I%0xxu} z3jfZv6y~{+#i+r5a=QfP2~yS$c%qiVEI*|m4z&N>Qf!<+Qnb|=JWmnxaiTnyz5nbP}R6dNOojSN@C`^hSMH4Gk z4^Z14RI)XscFD&GpBvRWJ+5_nvGa&UZF3BI_&KqoIYmb^6#fM|+5>3N9i0(7ir$Rp zufUuW9QA@Y8lP>s@-OV*@KyDL+SBzw~#nxS_I`8wk zYlNS42{$}rwJkEpyeWGRB-Kea)lar6Jl(YfKESmaTz4&n4|1&z^T`7{p&Kxde@*Lw z&(l4&y-~NRLg9RgnIZgo*BbB}U8}H%AtK=QUz5yWM_G*Kcz$rbR0a!WgGR~Xld_J1E$t-Hdo*dIjI4(LK1?R~QiBR^1q z%}X|Cj#L+%sAI|97r#N(2>XNi;0q;ssGXsE0$y`QW3H zx+)6~g?}w=2Rq%mryWZ1Y02%-XXu&CLLF^22N#D2KMN0qFOnvg6yGd)Y{jxH4*k>W zJX&cXXb90wdQ>j{tYgV#*QZUZ!4-Y2 z!?YA0<614SYe|>5>RJ{4qHAffndJL^(u`OShxtq+Mthk=y>|(8rGWn{G*@(ekb1i|t;aUy8 z$F&r`*R?wQE!P_G_gw3NkJ2ZqZLwW3hQbRZT7o_Bv92}X7rIu5XStTbC%9IFPjoGT zPjRgZe`1%s8`}wv)}xQBWj3ck^0ui0zC`ZxIYo&8C3A`a!>8R?f*;wLwCr1y6mF4d zb|Btu`H#PO|1+gcf7%{3&MKO-Z=8^aUZkV#$G{ohffYQFoDF8>vr3SxGOhUUWVwC0 zy9eJa$v*#RKbbLex_w6+iOAN@wIjvQZLt`;Ef#|>QH1M5@Ocjk_f*?#wZ{K!mq7mh z_}I$wt`>!l2D|y-<3XAWjtiqV58NY+^77>^3U6^c+Vpgg=7Xu`t)+Xc@O3VM41`@N zie0gn+C4+ZY_Gs~jTqCCy#m9>z}PRO*jOFW{$S{1y25y<;#}&gTsVozgohn$l5|g- zMA3(4F8DR2m|NB;GGf^*W60=#+gO40zkMOuzF}`)NJgNQoims2wfZ1^nVG@fuhC|W znR0rV0lgrBZE9{9VYv4WW7`Wd1I%vaNO2CdD;INXTNaaRTl!e!RP592`%hb zNyRoO#h4{KpAV_cp9pQA2l9m{n~C6~!Kxo5>_q$RgoTyoj8w8+%5(D#$~1Kp-)*!Z z0{M2HIR`!Q=<0fb;$9r$_kw&^%g!qBTe8~0el5=a<^x4CHOpr!F%q=120S?o?p*Lx zN$nr=J)lK#&@CD9dxF#pG6ohEoDk0XUXY1kJp}rMomZR@ECkau3v9gySsUz|T6I?}9W4l7?A5a}rIGz+o1#*`kC`+th%#&kc(aeyHZ**5)gS zPn&RSMkwIb>_7sv?TY@7(Ie?*X!k(eI|Ji161Xba-u+CDCIm-wCkoy7Tzr4qt?)fv zG3-1pCi(R!$zdGPZd;#YN6|gy3+3pOI@&ORB-uWFi{9H}(SKVcYwwxpLyp%*+0QTf zx23%3y<`(Z_HPW?_k+tNSx&1*D7;ys{np&->^ILQw@^A7yLzOUOxs5>owgV^HoDx9 zV@HH_Wf9hm5P_bv2=Pxnm$c%WubGL;KP#I*A`rnUR(UEx&Z&BSE2XF4eo4tz}e2B3x~mdCE0WL z=A&Zjr=e($ub4yyeW`x8DXboC3LdcF*#t+a)^*JH0Ua-U2hB9aI zZ%LA_ciBKOGuuQK^D5a_9-?fH3|Y+uX9sCMxHL$!L2{pH?*ybHW72SfhZd(PZTikur8ukT9_w1wx?9Kgin>{aM|HFl3*5_7 zT{nV%Qf^l+o~13sn}glRq85c)+zxyq*xABL zfkxO}Td@fxH*%LNTN;w>t3ED`ZYy~jjk&jbF8#WblA2Jtq{8EAw1-0*=7OX>wzBNf z76os^+_(+VJvqscuZ@&Fg-|1Yr=z{`JqaeAUF?rbkajZQFM<#mPPceR5EKUOk zcxq^0FWBL1L)n~)uUBj3B;RyolkCyX+B@oUmD!>g7*e#9{3$e zdH_q22HCtW_D#u7ZKY1BRXS!XIsBw+3H+36Re1JZc|)vj0?%BBBxG*r;c~i3!Tu0}_TuYLE`gJjzCGZ5G`jcxtn5FpV|Gp+s0z;y z?T&xqWvX7oHmlb!jpR$-^rj{HRFr*?(7({Vzh2C`9zMXesO#~isZ+782dP%xeR||k zAxOzJW`Ue9>xd6O=~@G};O&1|dtkooVOm2~!eN2vojO|X;C}^a9?18mHEm>o|B^G| zTA6%5_?inoF3D!YJrx|gt7yS1e$~hp=o{tYq2PT8#Cum|aSzVNs&A|&=<$Z+BOI<2 z;mHOEM_y|nmMG?#IzL@E#G!4c>hNcRSrhbl(PDygYM1OT zH_G9II%Yizze}HWFs%WvajgpTb(qYq*rWLWeMo!|e1}}wy)gK0NqLV_Y6ZhVkdP(! z(Q(8k5l4cfA&?kZ#Ab`q$Ae)L^oUV6#}WI8cujCL3=$)Y*jEyeAA|125;LBV~ zV7?z>cHz4spLV+xzRk57e7kE2{8`tcc9I+06Kf|(b-O_Z@wDxB;=oRSkd#XnjVqNM zEhxDfY?8_MIvN81+_eP$rE4|#C0ggLQ&adP*J|*|t|f4xK?y_JfT{D2}$+tugC|7wj9xdpD)eURFHVK`-|t1 z%-F2H>4A+uAG;jmDCeWx`Dt`C_GfWMWLcPSxT9#LY^c^r9oIMbQ?8}(de^G( z&s~f99shj6*rqagiK^KQ1@V~oJEhMD!$FXcC9^w@*d*dxgQH=P7&a6Y_$$Gz33|Ly zdypXZTpGMEI2r(nVevx$5yWbOKlhqp3JY+Kr;<&}3Yoq`N9%Nu1+{zyUaJZp)-gM~ z;G0}a;E%ahgV(v1!Z*8Chi`SQ0kh0o+#Zs|OWs_nD?8n;) zQh2i)_Q3o)f%R$w=0q{A4qxqcQ}}JJ)!=JgOW^BVi!K6dH6^~Tqs?280ksnzJVl;# z-BXEPqcfR-rB30&qJXNp-1^kX%1+M~ng8|B% zS7g3(sMcGSL($bcWlkb(R|O;TzDl-bHhb%}{X9Ilr#jRgnXew9uy5$)UXU5kwkxDi zA%`~w|EGg=RJXmIda3=KbFnH-yem}gE1KLVf!&!61NaBMWPds+yh$)DPjrZxgJ0K6 z6YS&4GpAo-Ki9l*EE>!bgd45z_kW^ zlWRTjviC{p-Chavo=YYq5m*Xr<}Tub4=ojZc#gk|@~} z-YxqFJ5nf~`8Vmcn{~7uDaiAal6P&cl{G)GV!=Uz*>fn6RIQ)lPutK>lR}>ifO`e0 z58PYQxXR)cBP~h? z_)V@Q@HMX0;Lp33!gsh6n@z4YVfaJOW^->tqNE4P2YBc z6uKp53Bo(N)_}*mR)=?TErt0zx8|<~@8)(1oVcb`eG)SLF3~iwMFXUoT^qJ6_Zm6H z^_nI1;ty=`>z$W{c=N!+HPE(NgUk!N8sDr}>22$lhyCc85L!nnnuIBt&1zFp5 z5`3*fwKpxq#bsM8_69#SdTMA@FWAwG@s~XYWq(en*9UggTRBpU_i5SxM8|Bo{Hyp` zp8eG$RSozC9WDE-x69j(^3vh$#;D?p?;~#>93yU`Nly zdlvrKFs`k^*G73it;S(gaBWCI<#QlOHX*0;-=mfLCzcJ%)P%S!tHfn{%zUs_diHTk1@H1Y8T8TxURRSzudro@!8 zZo7I}qCR9!jjLQ@ceurAm8-?Bn^c&iCB1usO!%=6%OCu>UK&@q%py`EIot2tv$VUq zVsfh(m6^1g+HLndApL6XUAMfO64T7uyJabbyVY*14R%bYEoEoJmgsDtbtGMWlFlpk zX3382KAl(hhedV}X(a_l)AC zEc>&@oK_tHSC^fmtD}|T3sJziWdDIM#pi>ZLiSv)cmkPJoIBr;??3Bkrz=Pddyiw& z((Y-|z3fj_WsflJ`ar7gs;b?qyC(d-s zKlsHU%>iS-<3{oOi1Ix*IGGK;AxLw;*sndeFYO2ZZ1|1ANfTTfq&Z;hcj731|4aE^ z8JrA)Zwb;IF!q~{;&)H|2*d$8+9C$NLeiwlsz;Zu9(Q?Vvi*omH9cU}JCWBgpb++wbi@ty7m+#u;$ z?R48cH1+bWGsfhXGJST)SRJ}`(wyTj)$Y!c1}~8G3?4AM(mjA5m$Y5Y#`rGx13n^Y zTfL9Xn6Po^1*c0YnHs!wwATXJiImU8;zG!kt6wYXPBucTyQ+=p)y4rWL@sOgOdVvq zVAq|;mQpw|TubMIEX!>>28|Tk;{PZkB3ecu8y9o>lcf|0Z+6AtCjE~>|692B%mp6| z(j1Tkwl|x$-DvrIQvP?zHfnZJ(eNNMCboqEJHkH@I^(=BJaa&HBo_XGr4-)db|C%O zwk!5zTm0Y4odIpTr9gx1PP_t>?^el^>6pst{~zc1kVd5)p2BXS?@lk?rTsIhTWdz^ z;Fl?lo$T{uVQL^=A7^6Qq-^C7Z&Hz$-&b=7aQY+peT{H$|I9mKXB*Ur5rP ziIOi9!SdN0X8Bsr8|=t?bF`r^dEe}RG3(!k0hkZ|uVmeBa&byLpmcak!W+3N`d7H$nIxAdF`#~<)nHhY8 zn}J-9%`AZ*bTg3aZq@|27OtlKAQxIQtHQl*269C+Gri5`V{?T1lr5s2c<+?N=Fg-j zB(Y;N>DB5gc3~#nBZ*y-NrP$|U1HL8l4!n3_er9uCQVQ?XqHJQNTN9=c{_5tP&cNl zb=;|9`@q%X8V8mA4*eGSY1w1X3WcXT4BJ? ztpU$-tqw16Erri?tp=a%S^~euH9evC3Bl-2RAcQKF-U*en*d;!Jmv4jQzCCO1PPfN zdbpejIz9w#g3TZefP~4P^HQP%?Rf~;88rU5&f)TWMu^Z0;?ox7J4Pt%thUoS&UJi)BURi@S8-^+<T7096E zxho%#?NZ-b7gXVKt|f4{Yc-g0$+{UH?{;-~f@=+!Z_ilW9+4g^U#L=h#iHr)h)fsWeoZQ`X+?0OQ*Hh1XF1NY&=Vx5qVL zTssZb1U;(FQetlbfN|}5v9?`g+W)#ZW{akHN7oW~ylXXh7uQmFSJ&z=-(1NSL-_3- zb}-))FuN3fr`y%wRjws4AEhr{3}t_ajkF8uf5^Y#sF8igSUUYACT4XXFZ;HqmW%*VvdUmc#{b`5x@o?Dn*4}7F+ z4fuJk)!`o3Qur9xYVfhHCGc^s#Tzx{d6JH{Hi1+tpQ?1`X`x~hq+TP2P_USXbtxU&(t-O(vS&@c_d+~EFYc1RINILp zt8$NdcjdCu{T_DTmi{~>u$L;)g`?t@`>2@1qd%Eta#YLE(ouOLEipVr4LfLY6 zsuE$&TFb$$CrW&gqbe(i?MgwaZev$U?PJ0;n+L|Vqg^SrS>J5A5{S7ww7gb$0O858}WE7VPxZ zKdLXR?dlG8R-7GGT&Um|>X=L<614SYe|>5>RJ_kuWKp% zKG$mS8rKqdt!q{Ij_?_H%dhZ{_Ft`b*;O*2T-oVP3&u*yCmJR4F+=eETNzR!5i=~L zQMp#}uMc_jf^?NV{30T)H7WKTtzWa0%mN+DK50fi+GJI-c>wFP@R^ptdIKZV_`EkC zn9HBGY={m+C&W{VbotsS-0o_+_p&;8(a-hfi}Yh5KBq z!2_-(@NCzr@H%y9J3)G|csxde%`6a~w)ld4=|7)Yln7ArHtW7}OV0LyAg&dC9e`S7 zl3iV9s%0L=!8b=xw;4)r(@>oGBFp`s$Ih`vM;ocX`#GX7WT?W{tBD8 zZC&uVkTT$Q0>zDu&Z)A-Zc?{-V~6=2gHLocj)!wR_sAM|fX;`bbj-A2@%bIvwc;B( zw8z8~IywvfsWiJu2VWjm*+%OO@owSlZM2RPzq~_xmH4$C8h@$yst%16mATbbIU>3$ zY+ujKjav|XD(DgQ_aR|&^;2tFXm>wziT0N~d0+~h;?~@7v!?6MxyY1m5Uc4gQ*IDf~^>>hO>K8rOjT-L*RG z-v?Wg!asAn8ob%H1b)c1=x&p?epk8KY6p^zowOjH$~SDAWb9u^$+flLeAqJV_W zv#3$LF;t!pl1=*$##7+!MDsXR!**a8(wDYihTF{I7SJIi9*%UVU12~*#2(bd52vQ6 z<{2URA&?k00O4=-($=xr08n6}+kzBl8tv8(P$bT2TQF=Z zQ&{MRb@)QpQh2dzHTYuJ68I9=s_^B~+JPyoaKk!$rE4k7ucBp(G5i*{OJIJ3&g`N+ z1H*fbhQrofkPfp|5G zs$|rW+(5?=&Tdg+QL(zkDMuRr8q(+miELLg@cV8BJ`toLuoi~2mkj2+RLo$dURtGN zws^qraV>%0?^+Gsb!_g{>Zb7SuGQd)t|jmuu0@L$x!t9hw(x*dx84EqlnwA;tJu!9 z@ogK>{ceh``%e;P1Vx>GySh7WWtfe&@926J1Sbr*cN+tuNQYYq5F*LvVb$K{Q+ zi_7{k6!@Vf3(^DsR)(fE;NQ7chkx%{3je{i8vK-N30%?LqQ$7f*Gg+ANa3As*aNS0 ztpUHwwK}}owG`%Aiv_O1Ji9e5JhkQ_ZacxkEMau#sh4fSfwa%Iz~Iwrem>zSU8LO1 z5L_ChL6FSM3M8@e`5UL!BsGR3``nUJBALurvqgz~%n&3WyOx4_sNsl{*9@aTrA zV%K;gt`05dRx0#3@1oHPyLy2nXLkvYEvGIhb*@v%_$p#&>r!9La8cA9; z61l~5D|P@Lyw=c*WIYtpUu=K<&Aw+l?Xj_FG|g64MzN+AO|Z9^F-K!~%>0=X7$yM^ zGE5M66x|XpRbTu|Xl!$h@aHb!h|FwCH=-eFo-fJ6Mb9=@MB(~wjKcNB;rilmeHTRG z`ikAuE8h%&eT6Re&24F@OixnlSsi1udR+b$>uEhRv%xKT+lFayFJKOFGTF&@p3+?w zdcGg@@rh=B(b3NKUd4r%+U@EA*)8jQ`QrUuZe=MGGpn^IyUA_WLM8mxK8sCRtC9Gy zj@kMT-{e{Xf6TQS?9cI+r0^|nSBGzPtpVTeS`W<6{@I0bn953-#gg$)w31mQ2a)_}j_S{=U2wG_VFwHnNCX<3W} z{)XFC;d$CLwi6s}$bX=&x63(5huOUgc(B@^Uw98?z49e|YI`L-v_7V? z*B-5>@E)4pJ4UzzM|*_!qJ3Hv_YIb(&lH{zq~1lsYl3t-&HwlR%iWuR$x&7P|DA;} zBrMIECJaL}2`~b|fdGye5JeFYu)AkrCYebfAR?QABqTt{L<9xgf=1y*w1XSSqKKj( zh!F)*coh*5l~+;l6-8MT5M2M~R-Ml|HFc|#pzrg0-{&75roQ*oxo5lQE_G{ZC+)2X z`dU2}ydXVa4Wn&jO^6`cL`eAtiQ_nUr3$(MPfHCTaZJWY;@HH0cXTlJY7k@GtHDRr z!RPe2W70h7BU!sH%QeBYW*mfQf*7whZ)~>LfTaBR(wS8-A7z!L-+M<%#QnT3kSK+^ zVB(zA#ku>`lY~fNyfs=caEc8$i^er6;9pXig123C+5fb5CcKapGd^IPkTA^!MT_Wv zs35{3^D_|HV$+2dA@17=ACRcXug|ZUNC7L7%6U5yVm=+Q1hsPY5W6%lFG{%bg63)? z(ko=l17cm+@$aLMF?Ho=UcQ*Rax|~ujjCZE>!p3O74|ymScTrb`z})wDrJRfr68H`kL`oNIn*3H> zvC*~EU^Lm)1T}yj@@N3~g$nwW9$5oYM$ywq;e3a9= zz%{2;!40QXz6n%HTy# z(^z^N)4HF~GqM;25(gP`fw-5h-Y5;Je5nh>M5znJinOj1!k4TTQu)i$+V=bCy+(#3YHj`Xf1L=Mr&%(3Izi=U*yGwu!F(Jp`SMo2ewxq zW|}Y2QV|JWYxu7!z-vY8=$n;=k9Er^y|wDVdLiYT1*^SQeQH!I8b((t%XxYXLk9SK zrh}tt_Ix8>dBYZD9lo#@Bv-E@U35d zUtWIN*HAFq6!Za6kTT{qT&I>JR=#!xM5ZiDUN8@kDttf`Bz$@KU)GNXeoc?^Vgv9S zO4>+X@0IHqiqAObOnq3m$38DO_Y{TicG6e0)&8hQQE`|)J>08D*@Fb0W2Cts)nI+z zg2odZ=EWQ}=6O@sOJWcnS!UE#0FfwIdEm5rHyC?2c#Nv~wy7J8y&J^Q=gi>|;O6Sx zj&f~ydPy&F&W$c{hLz2OF&GD9khr*8(UN|)#^*KGXhXnWC5BF{ychxWIP?KYH{l{Qmsqs=h!W$YaNVwF=^jGL zcaEK-0M-d0(UQkz2$n~tev?MV!%#n39rW?LerXhjdK`v&yV~gv)?)|jv4izHA_t@8 zC37X+OqK{h9F+0pk*K2!UqLs2q^O%e60MN(O2hj7OS%3dT36brhN{5GY)NO9tBSem zCs7g7e<+El6kL0JQrni*jx5=cIm^yjqsY|b$kY!~pFJ}5%cIED?hrkSZNTGoe#zl5IRbr z9Q1P0GR@mlQf{s3zodJH%3Y##v{fs#(7d(y3!U>G2awIq9xpd zXq%q~Ao}uKHfvW*+GmEWxF&_?8S@#+k0vo5iBs5cjz6OiM6#J555XkUU)DIq4 z8=lZ3QJ{>CW1|2S%g6eO6PP*nY(5I7Xun`^mMD;C-}5K{ea4R(bb$(biym=>GK$8! z0u}XRjm=v!_H5pjV|2V-pvQ0l2|nIwW$+13tAI~*S{3{@r*(l(a#}a|bf@)z&(k-e z!(Ezj6yB-CZ~+NE-)Y_8cR8&Ke4*2-;ESDB0l(L2W$-GewShmseHzBZz*Z5xLOqk~ zHQ>D!>d8eGg&!$V_<$~7_|`AKuR#9eCjTcUzYmy^|9B*SRP82sGA6!HV?aG2<*oXS z*4k#<^h~%=>CkF>=}{&uATPbkg~~(47b>@?z!R);A7*^iNuO2tDzvQHEDx|ICvf(KuZK63Kq^%Vm=%m9Hp5UZq3NLfgXB2u|`|@$UJqklT z4nzI=C=B&yqcGHWSJOQV^*9XmI1Ke~M`5VPVW>}4Z#)e3qm<-fsK;TbUlWC)o)5$B znpRhBm!6R;i5Jzum#c9?IySO%1Uo&%(Iv>dhNDqJnPHqpbgc zUsqCcy+Pq8&Ig=m{tfQ0ux6y%sKN`3Gzh#%NgK&Gn&tj0#Veij=L&yqq#E#XtDHQ9 zN^z1#SoS3d$akIes6yI7diM?*e{Yi7WlHi+HAp0#XB6<$>OpV{O zdJKz&zbbx>c{v|=l#-I=I|YyK{LA#b=h*ybmBjZt!Ue3l?ZKH(aBj5VjNGZv<26Dg zJg4RpiCxs!;6UE*q7~3}>LiIIp(h5OK(*b}coIptfOws(4U%Va&z36za>Bv2ZZ&=fNuI5IwT?ql}`lYd@%{AG^BCTQc@+ z-hxxKQ5jam6(T)FyRDFbKA%ReEKosj(Ic)*uWDwH6T8W} z2R%=LzFLS}xkClrnRA6QipIJE74>6{&08||Y~Ga{G>dMuK|#JJrT9xuD}!%wS_OQ& z)2iS*oYn>YrqjB?_d2Zy{PXtIN?Gu(nnK|hN(?J<@FPy^2LH-wUEs%@Rt5jJ(<!lQ5s1d(N4;XDb(C&rN_&B*39{-6 zfzo+JO5;yA{8?M=8Vk_?@H!>Q_Y&UT%u6d6>-SY7X$x^2c$e8f4E(eyjKU)ob4gG- zC?`8y04-PAMJ9Y6@KZ*r0q--?JmCFG3c|o!?Lbb|rz&iB60lQAq2}upALDEb6<*?` zzbl-eZikwiDJIbJtPEk^PJ3Lz*FoN-R=>j>>ILGybU|eAYWntWE?0bk9_49*%W@_J zv(_K`y_<0$_HM>5?j6Y@^d9C0VJ4z07Jw3nW z-l=ZQxP9~(wyMDUI;{-e-)R+akJGB)S30c=e1Oxs!LM;z5BLw&)XMNEL5aeXN(>Vt z_$jA#gP(C)7x+(3tAd|%S_S-Pr(P3-vVF`Y06(>15*|>tAG-wL&o@lMW||LW%Zq;C zR3)v)i$j#{P?rEaa>FDnSGG}?0DSL;Nw`_rzU>my#__*o5@{5&%+IE1Q_Z%WE$iw) zI^KlRxyzbs^!#yG{mvhXy^fIi@| z4a$HSWZ_jV0rN-!KVe;WUe0A8>|}))NP^u;vngM{k$}vhV{g0r(#q zCLzwkXpj0%9sYi-M_EQN5|U{`TCI6S&dQY(X-mdPrT|aTOqsThF%BLEI^i8{H6EU? z@)+_&6CDpViCf913%a-4M*i-Reyt#9VQGza^(*xl)?MK1oK^;Z(PdpWHQe67=};Om@L0blR5GWc^&)A#k5b$ z0b)(MBBF$DVFaQwWps5Zx=odR*Ob4 z_HKf=vUm0EZaB6OZgzzZ2N^2(}8&Yk6MQ7+S_yb<-v@-Zir&Yj9omK@e zb6OYp*W*&6=;#Ljx6``7k2|dj{+-h*;NLr~41U^aZQyrJaJ_1l9q|7nN|81IVxqJG z@DD0IZ39Zk7eO?j^9frSMSxdXeCGkbXrvnORwae6{et;| zsBHVZUS0QOiB<+zMpll{v@U2Q7BrIgw9xPU913+Q%7iN~1yJ^O-5@52hcRy432rXS;}>oH_GUx~X}X_9rv z=m$;~=`pbVLowe;DcF;Ivr72BNg8>p);iJ599gaKDktT`%Wp@Go06Uh(+hajrba7+ zFLPQO_=>XgwUY0znD+w_DX9XyM5U)WMG5%@Id!yF;JwWdzPt&?Di7kMv*lUVs0W{R zPujpQI;{-;i_@Y-1F~*V9_d9us*58)Bo!|ju#?3@XdUqFdQ!F#A1P7zx)K8;mGeh- z2gESoXOu_!2oOo@HjJf<%oo6$Ox8SLR#yBu670hmnT~*8HCgk4Sy}Pzuvk_DS=oy5 zEv=Vp%_~h~FYpE>$(GE*CJH#7sNf1c7EJML_0%1D3~dAcmeb1M?>Maj{+`pS;QO7{ z1%A+J-Qb@(tp|Ly&Sa82PnRfsR*7O@57>X3YiT$5I_K*G^PzI7TLs_Xd=>DGPAh|N zc3KsP>2C4&gSgYs-JxV46Sr$nq1HY)^(@dr`L8oA01Wq$jKad~37B1kxnWd=*#QxwW@)r?$;Y{1 za5_e7U!=#P3G^mC_ux8suGDjP>QN?H;CGDF51e9sXklrmCZ#Qux>@P0O;=Amt84Yd zjw`(qd`*#i8w&N!vrliOoxkL)$M7Z6D6( z4V$mZmYUK5AfhI_hDiLBjQB|Q8IkNdvafM7*) z`C2VC3B#<6or`NC!h*76u9y*$j}?vhIWxWn{JxSlljjI#&5#VAe&VFFN}Z7TivAX3 zPxrKQ0y`_Eb6$}BY%!v(x@$&IoWM`3#%J{y7D?bOC#I%{wFP)9r$q~0WNoTEl4d}v zg)uz-Sr95twu*f~1jw%h0JE~Ykl2*KSz+-? zx2i&B>M=wb{Boz2!FxNc0-oixDtKR~b%FPDS~r-_yNli)@G%)aFrRxDzAi97(=D_r z_yn(80iWo!GI+Jq+Q9eO#re{neD~no{m#<{{)yAd;Ga3I0{$Jnur`L#jX~NZ`knBu`PUok#(dg%8VYt~I9VG0ezED}IX}3+`IN z&X>%~r88wVIx|eai#{b!uj8gC4Ui#nZHWRm0z_aB z_-bVoS~r-hlAsuTo%2<}pL1FTe1p@<;G3P+2EIy{V2ObguJ(0V5BRfA>jq!zv@Y=V zPOE}H@3ac|3r;J8Z+2Q6_&{y0#6X%jf7Hh@N;1g+38HiY;1|^YbdsTjGr|bGQSC?> zDPf5)=Jiu%T_G2Gz;|Sn_BAQJU#Y?fM0`3&Au)eMtXydTkr^u13pCV=G{oypG$B^5 z1c6x%jRFmgA`S6k^wp|@P1?=nib8(Tr)Ng`Y1Jn5qm^%)(u#0?3{z+G1wG5p%*ycp zCygeT=6S);x7T(p7R)v5JCsWV|5@R-nuG;Y%?EYE@d`b*l}7c+>Mhi&t@JoaJ|Y`_ z@`y5fb~26v_fl3DLaT7RK-Hi&Ok0mAjXUuLdwNv+p|Xl2Kx$7cEs}YF(!pwpFw#+o zvXBT7gF``FwpEK6q+~sUAch4Y#eFN9sOivTkMwci8&!uqOEIoVfh-a}APJT5@vuId z`N9W0BP)->s1k(_ctMu$A}w6ze85j+`6zte`GB`%`6%4!e8BH#`6!SH@)|FYT$DF$ z$2BR8vlg8X+*nBo-xMv7wjvMsiYy-m&ye}RLyS+_gDuNrlqm57o{;5RqJ{T3ACO@s z{Ps7=^CM%M5B!;l6L){71<%&`z`q)wm^VecHe-XB2V|H?(q)$N&9+gYA9#q8624w7 z3>)A4;}tTnhzcMxo&=dLaBEf?dq5AEw0_{vvV2cyfq_a?0GUrjg{F-i=u(XDG6Df- zTZ%0lZBn3X2_KNhnI_0HpG^vME#U($$jYNY*AhP9@+=<(x|Z+(Kb+;G@ChZ#g$M9D z<6A!3q(IjaKHwc$J_>)fQF0jgPbJB3<%~8d&}Bp(uzh?gFyW&>{}4Xlp~@$&^(q{( zsuEHPr#RnP3h5P6l}>SwaSa21Xwt-B3iJdq1o#iDTBA#BVHqZdP}tQnvGxju^aC*j z=-EGfqH>Y)!Ueq6WDNtaSCVw~HhP3-@UXU$9sa3^C#ob3_iWl(1z*!P`-Qb#0n@=c zwfE~$7TaxLe)~~qRq&b&A9y#tdZXyDGeaXQ$|YY7m2{EDe=0U4O#Td=z$4;F{Q&m)QET>;-zBV%}=X< zU+S^2BeRQfgZG~{Fk4m9_qxHy=q5(!%V2&#EAZuwK>nSUX#K#0Y(JzI=o?nywgM&O z7xbSWso2L%{4kJ>j_}2X<+4{oxyRHFqhP6%^7em81;5N#2B>wplk&CL%ECNpFd)Ck zm3%IT0yfLC9r%PQmZxRLH7U65BUr(vWFqf0HOU*PxcZxvkS~n+RJdEk{#cKE0fq8!mEKl5Q{Qgp2k!Pzqorl{Q8?hFSaq}` z{CO2k1Z9wmYenPU7qu2`A)88Zt!Qo|WVEUbHgT=^UWxki13iY^1M^#4LMwx-o220l zeBeEuRt9%Ftqpv#)5`fqx=;20+~V60M0HrEsDx>HOmlz|x`h$Q4}ztPlrW@VJmxo< z?r>Y%z~6FO8GM)1D&V`FRt0~@X?}_L5ac#oR{UJu*CQV-l34_Bzp7Ve~0>Wp&r9G%WhQL z`F)Q#Z&sAnW_K6Xz&c(8yx(BPyUB6}B&CjT|YfbCC`xQ1Ukn?~9 zR37Xij0aeF<^czd6g~chAUu+Ro?7@Lq`Wsm%KP$=W+A;qHde5R)+yL)`GwXZhvk_P z;6L@$gwnEcO$t*iDucjdjWhzJ^VHG`v0iMFwugaby^wxqSGqizdEf7{+rXfz<+mIH+bCU zX>Nyk1-yETlqTc*(8k}(l@r8ZDHg;OG8 z!U+7D1}bHwgyq5r#K@G95+)Z6$Me2j|JXA1iXRD)T3_BOCH+#51%j4Ef`+Fl zw+kAM1w{kI`yxTTajj@|eq2;*AogP*7BrA=!IM>x|F~Km=rNj)?2RlSb$$z=FkUiCmBaS1KvFUqFF?2_Mic9f>WiZKoD?>M@ZGU3+?#Z>0%|FC%WO9jqY9`c?Jz$<*9cISXrf6c6^;opbzDir|mP|v32LUMav0}Nb0X}YR-wX7x zEjqDD1MZ{7$+LqeHu>752Tq6-XlhBkIF`Z}x2h1mJyV2vf3V06V2R5g$jcYM^3sKr zm;DBH{V@%QbUq+ik?>LQ6se!1RXj!N*DL8} zmj)zz!ZQY7&!qZ)YmKM8=4RUa>24CXI0x#q=HWVk$^dw@!V{ddNTE+AjePFXz^}JZ z*MPlBN~S>y^PLY!(B<+J_$Kuy{VgRee8HTY5Bz$TkAmm%{5X&2$DY^bMxNJ}MxNK= zY>!tMno(=@Sa=QgkS9sfdy=NEk*C*&Wo)|mG_g&0yWkN;g|Z)~!Mfm;mGga*zew0eQ&HjTBSa!vj3zFyp5?=*$E+a6yyaxP>l9K*Mfpm~XE%4>$(E#vZ^XSacCWWJ&4|q(LkAmmGKpc$Pvr#Z=aWHC^ zM8T-V!H6d5yVRT?=#`fA5SGSYvgVlgO@$aITsNvZbO?#n@(!(6&HSX)3mzDQYQZGg z_B~xX+Bhu_nq>pPw<>8u>CEv>3hu!`?7={6?m%pA6rFBWbd}jKA9$^~ZlimQjbXo7`r6=q2y!^sN`*)+(9YL7eH4?Y(NF1(_I9yTBx?k1( z%38Mpq~Vh>g~H#Q4@ksiSOxOzz4Sle>n-@p$2BPsPT>Q3P7KF>599ZDEYTYeMv2}a z6gT_0b7z$MjW{~P`2nBk{LH+r1AnWeWCcXwIp+gTvrOp)PPb4j8f{W=zk6f9dt<-r zKaKpZ$9~tp6Zu__{f=gu($;At*g=w!0?78!*v+KPw@WJswOX)`WyCO$ z#7`b+rEs|O0gqHt!bjme=L3>_2_J=REjYtK;+F7H_@(m!|7fHdu+190zOBODoCG9o zWL+@Yq`(~m>E1wEC0ruL%`zM}%W&K*!*R0=(=243OkzM!!WwXn=B0#VT$6&2SG9bL zPSwc2%vzuq_)2RjnFJ`j#`%EtEFXnuoDcYqEFT5ByKJlgAJ&$V-KxZ)gGhM9J|yqYcZ#B#Vw>rzt*}$k43Y=Ld~oddX)P}ZQ!pstqNZ2v^MY? zI#SJ2w+cSYY5K&ETZhgMsVuqO1pK^_dVx0^sULWYlG3#Rr9)JuBnc2JQbxBRMc8qf zY3KtYGgRzrQhL!Dfmsdlw;|B5$|}}@$P60lrr~jC1ZFkFZ|hbT44tZZ$EH1YvhI9`QWzcIe5gdRxDd7Yq*?CUXqKd){$~hj+HVEzDa4( zg%i?+1th%NG(1l@owIpc9#Su9S9v)Th=4Q~T2(~d24`Ph<5s1`8zq+a%vd}r0i8`u z7^iMmLOM=|Enqm|AeOQg0TR3M@}5NA`YE|k7mhwPWoqa#j1k~IrX{91O%d6)@i_ZsrYmhqx2!AhS5{u&ec>!!5Z&E)pV(8oCjQ^ zr0^Ks3fWDe{8^<>k=LG*d<-Wct~EI|;GdNw*92FOQfM8T?A8 zRlu)uS`|FoXgF;(@yIK|Iuk(;Afpy1wZe!3it)5mBBAMtqnY5dM1J? z^uILuyQ?Wp#u6ZbkaZ;xpVM)O5(Wt)5Zx&wrSYAn1o*I#<^g|hq<$bS6fAKMQ^RQ@ z>5|w*P=tg9E@*ygivK-M1ufU3>?{C@h}M(G;CQvd)QFxsaWsJH@O~RgVMFGYf zVasb=rkcKP8ta>=&^MXzI>KF0w4FlqF-`otVU)t=CaM8EOi2kJg)@z>k6ih_lkQje zD<@sAUSn7yE$`!T>YJG;p}{!@9|;W_e{JH2$(}7$O$aKOA1jiYz?sU%Yh#o@p>$!z z&}TCe!K6k(GaaWcFn-Fkfw_!WLc&}Z6wM?EdfM811W02gcl{_Z5X-s+g&v;~6cQ8R z0`8y=Chwq8z*FG^PO?Ez-c_UE4ve&F%=^rN-Uk#u>m(p<$R5MECIu!YxgNkLrUD`1 z6T^g%fSa37vQa|8ZH;yrcGgUKm1R_Pp>?#1JX4QyEw+qP(r>irUv<6#Ghs2`+$Qcei*nw zN%At__$CFk1f6|NO0F{+=!OZIDHw=rMcsv3@3BDd-F!sxb}A{n)&V};XtN@t#+UYK zdJIyuR{8I=dQ02D@7yKjk%laT&v#n1cZ00^RF*Uvkm}MFKqRG&mbdF^m9d5Ci@)iA zh@L~@1`A)M6_@Ussue?l%aoK_Md{tnm^U<*)mJ2|uNlkgYbEPCwNEb8fyfjRf-W$l z>Okz=Lf&p#DE}=h?Vf%+Hm~X9Q3M)@MMlA<%xARLW~R9Y+*wJJOH0}&O+RK*TeZCj z?PzBQ;!c)5HXz!&zCjK6u^uOvCUk#gT;g04+7o(CUPb}_)7e*jOxdArWyTF+?<>uh z3C0fXI6r5a^M+@w$_IXx*1y-(_5=S@Nond)`jIoPUshj{tiEO}D^9)0u6mKIdV#EH zCHApMRwK3`no{sCZJ$ypOev1jvtc9}uZ;StP~fY8AJKC{tAc;&vr~)6>y`xl0BSAZlbl0zRts(#EBP{DLW}tQ9a%R#$PYXu4Rd27k*9Zv+3_X=U&) zoE8t~dhQ`Tii1F^6_4HbXa$rMc(+Ph@q>Dl0JnixJFN`D@)`o)X0^(b3azzdXADJ{Bi-0F$x=Rg;&5}1BRxFfopx$J+? z+I{Rzz8O5kfH>rg!*LlBT^#Y0e4E5I!&2h3KCZ^%<|U(;9z4jQQ!n3WaZdPml4 ztzrY1tr*`?ry?fHdjrNjrPQBJ ztJnZ$E5-@BNGp8UD%OBh+&H*6X?mP8JL`qP-gZSX1Uy_xZSv55`iusY0b_0eKj6&z z)h2#e`0vJC1M*qr$>E*X^pS`t;WyH1b*nxXc(IZ;EiF!U?K49@8N(&c!+LgOF*`W{ z0j-;rE;%?=nw-|4*@1}kn&Ms{iaScnQpK}o$W8W1YQ?M>=Y}uiAG}Kw*U?xo#iHfQ zre#iCE1Eo>RV%mCT9Zm=C6C}xMp_#NHovNzck5BkXk$Y8p~*_0#I-;u_?sTLGQP9Z z$9}X-P}*n>(~0|=SiqxJ{+bH^y&h#!1N!e7*MQ4ar9AdBp-JIVCCaR?LhSHKMOT^h z8jvm-l6%&S#idD|Q0V1bNbjzv>zkB;6Bt;|GRR0UsgpA_uIvl~k22FwAJ?Qnrx8B0 zS;4h>q?KgS$+HleOSHqQNtrRtCS^X%+C^POF0VaatF6meabyTn&aP z8ho!`6?cQb=d>>HeNL-_?{``S{D9NS;2$}y4g3qIwTzR0e7PS;b(yv=8>N6OnciE4 ze2IobIslMb#WOi=b+J{f1G5$5nVgFL`Dgptg>1!mCdWm7AX2;m;;78zmnAbf1SA%& z2)CP%MuXoI99NnPe50OflQ|@v-l6a@bYTXb@60;AL%Cef2s7|2#(cI)hO(=+xG*nN z_)a4=fP5xd27xs!51@U@*z3UWDygk>j;hONz~8h1Z#P>9fmpODUz^+~OzDFva*b&l z1fp$oU%Mn#@;Zt9H%wbmgF*yPP#cUPhi2mJz3__D`4<{Xnef3{O;~ zi<}u=jW5xZ@q$X9Y|_t3q*He3d^EH`dds!uCsg|DEFyK_`AU-a_a-zc{Kfh5y|7>^ zM>@Z46E56U;bVH-NR|?f>1`DGs=9Cje`j`_F`-Feb4!dy-VT+RZ~L=VA=xSKdI66# z4QGvOQh23l7|Lsqs(I<7Ik#ldf=h%>KDhz(Ur{)FT$2I~DSWZQ!Mwr`slvIZ5uayJDSq9N)<*R3W~QEV-0;p8v0Db=S@Q&FsmWn(?LU< zRjdP-8fgTGBf;9bDMf>{S*sAe(PTA%Sy>H}b-gnJ5g(Ms3ridzE;2F$vl<3X!|kSF z5SY~vZ+6BShR|?^$r=V`l@6KGtBi37h|+@2fJScG$;EC7JkuoAfd?w7P1sgXTv%#v zLcvbyI&wxEh;@Cqem*`Z->uqFR*yw>Bsl-&9u3{)$)^HkPaoq7yUjDb&8 znp{952_t140>n1q`lePuU$~>1H}gK_`GF~vPmn8q*lA_(qfV=U_t-dhdf%sqF9TvFO#&JkNyECM%m$HL%!UuzW?AP88wco;L7) zdQxa*@WD=N17GR1GWcqzwSm9mv@)12r=SzY?4lIO2jKonN*kZj8O{hi zYYZc$cRM5S6Jr=Decl;?-yOq9=}*oGe0~fgr77yLI0GaGsWVzDI^eo2%YgVDD)u!g zoo1%=0r5L!q=f4t5s2R@BPCoHMj(EtjFfO)7=iemGE%~IVFYHQ5YOBCW#=`oC|;M(|T%(G-AD z2U@M+ixhgTXyjO{ERX6j^epgMx(O$=ZtzN{wSm_-ExJR6{J)u1{lF8nnsg%I*-8p+ z-QT42A!F3~3L1@ZBWLq+V9=on(NJ7G%cIe<>9##$=99+}OslW%m z&}mTzNB)1Bef_|Fw3@6}frlz7?ckJ;4rj{p&vc5q4~&Im+f@kqc= zCjZKm)_|`tSp$eiR>4?Q)z;|LV+bmEhSSR6U7c0|@8Ps6_~lOP0@E^~F~K~aD6}5% zbX^K1mje`L_zJ8Cyo=Mi!Mi!F3;Z&tRl$2Wtpc9uv@&=vr?sh1cBm?Pn;vED21K=N z!~v0%W|j$2P}L&>WKsa$s;6XZ17>B#^8~W`tYRIA`_hkrSy}OnfUMV;tOhV!F&^lt zh!?Vl3Z$Yul5q2=%C$pWZ-{#2f+R}`oRJm(Yyz@=q|(DaBlxFEOMjfAy-E4cO81RV zCD`Frib%PFZpA$lEDt+Omut1_^;ocZ^cFq!A!C^j{D_hIfC!ve8eKDL;z^N$_3t-S z#yuvh0ennJ)8uxSUQsR1Pap97R(W@H-ZO8L;XQXP1>0opK?P%HO-~(TEPcSwDk&ZR zC|&D}YJ?q-HDoLeAhm+5I8ooO70@BKkxi%qSS~i%HQ)!8BoEn*Yf|tF;aXnQJC)y` z!=q~&=NXYf(Vbi#u_Rg{zfkIa)PMw_Xrq&>hZ|LEm;u20W@<@jW$-P|R{`JZv?};E zr*(n9=Cp3`H=Nc3zC#yK$)z=gZz?fN72t0+z?_PC6W&q&!T21;P@OC5310uY5Qb0Tpoyw#D%vOwN04kzc#u{L@Vm#ba@j-K_ z0nAp6dr|Cmza_MSKd4MBk&XsLw#*3eD9%-8)4~_^DpQMv9-f>u{1*7v$$4op9;W?g3<2)WqF_JY5;MyTw3Ap4K0_)Zll#RL8V6&=y@iJ z`yAp<8Wv0z`C3I|M-k7}>WzyY$cO7bWw~FEVaNgh*lA_(Pn=c(|CiIM;9oke3p}7J zWYN(LKH6zr;320~!E>Ef0gpJX44&t-XoSGm->7XeLI9~Q>pCEkiiZPaJ#DgV;~-lx z9uDG)b!6bbEMkCJS@8%F%W5DiTQMFXey>&&$%0GCaT>^d^jI(z!?J_1)PU2KluX4G z{K7RFG`3Oxmz$_)p50haxs*BiWX3ImP}EO~cn(w1{iZ$I5jaLqEzo1=C*aeZRt7J0 zS_OQD)2iS_PU`|Mc3L<19H;ew_uMEAKyq1fE z7!|u%j|C5F+?uNulIkg?Z89wblX=(1oXq<;=42~pf1^Q{dt^Y`K?X#c;Rv-< zxPTZhTzQj)ls8mJdGmzS$|$#>9}6xw3;KarATJPKHX(0ALX55GkFAK7j`=*0%>=AK zrI7Lpg%qnBjMYWMK0(lhQ@H+V1HVE~3at!2*lBHGuEPT#cx{Fc%q`Zy2fkXB1-)Qy zI|e=#6CGwKMTRvXCdz09oUL5xuto_Rg%Nn$7)DAMDU84?)!tMhB`hu&DA^xbY6jPM z=;5nQ8dR~T=uuK#Puc;aU=>{(pnfM6C^wgrfAV4Np4Ag)bxa@M{JxSfe!QGAZ8@O* zG)WJz{u*p@$qc5wLUV$*Rav1q!BwZVfe&+98T>}4Me9vHRoYI0qyliNlG0Y9w68M) zk)JXmF@Hp?Tn_<}87lTQDIr!Efmsdla#bJ8DiJ?vRNxkB#rV>a5}5D_8xVs68)gu_ zf^=M{QcpMOOWVN9oK`lhNg|EcJzntyrcm24Ef^Q7AxkX)OWVMoP+Hhk97o}k8OFTn2pd%%=>R~g zr9CBIkzKSeWQ2q7by~SqJ@!>aA&_bXqZd-nbu)qNf668CG120hdiyDmCI(V3?QJk} zJVC)7R&fCk#T})^%O=UM7bY+4rEvPjNul%4`~G=m^V4eU3ug22z`q;mG~lheb+DNX z=g&`^x#W>?^0%`I8EfVA@^Jd$^fcyje20QBnc2qzZ!yxTKs>3cC)3AeeMw&;Onsq= zCaIOqKzO;waw-x*HQ8gGV$CXZbK;yQB={yC9&dp0p)+Pa5 z(^Bc|p!AAjrPr#`yDVDA1F>Ucxjai6_$gY^tT}a@LadomTJlJ+=D8gT+EPwFY$sKp z9b)fKepvPKYW%p;aX|Eq^}f9*ecb!_IR(<^FXsJmz<(O)SReseSNgOkk@~h;P8N?V zon($Gpu@e2pqAbSe6^8|2co)lA50a~2Ul7Xy$yK2k&Xuv#W8)bFo@m<;~?Iy9z9?Y zI}JEhJ=ta5Lr0ololV#~EC36DokltyNKB^42R%a6lbrjz^6hHgo(9}YNtH1pj^}G< z6OIw9ya4!CBOMPUdfR)>w`coedpw$nYI;EXl1yU8_W`QX!x$ULv!cG3Izt%QV3vOEGp!Ml$HK8PibT*IDpr35PKNd()0@>uBa=I(@EvW_zoqP8iYw zpuO|CZD)2^FMOjpdMpq}UomE)&33xZ_Uv-PJGaV400Z;>r6uh?C1<*%$SDp`YNH0j z4m`5*X6twhfJA9HGfX`HISD(7)|+fpW9oUN7lmzep-Vg!<8b(ycVyK?VuwT=fe zHqXi=)Ou1V43J5~MFaaw5h7!0DkMM7AGzU{Y(O$M->z+Qj7WSxYkm7|B!8yz#@irh^PjcM=%m*iX{g+zkGx)Mepruk7aNFxX__2y zf9q@xsXiXRl-vUDui=>@cYEcF1&_!Rshv%T7$ql{%gKk6lQ_Y#uHZbgtrv)G?dupQ zJDYD&>wNm23&apHKwdjsxVDvb?Q$|aOdAhgdFi# z>jh%nrlo~zL-5wLGHlTgnbw;B->L=M~#MgPpsJBbZ z>p8%vAq!Hmy}4LTKHp3q1ZG;xQZcqqx)G@uo7bmiJ!a+&0VDH@E~J`oRkLgpv(yj7 zyi7kXw2popTgQFKC(OEjAl9`W0o$8%)i&Oylt*2G8QVf8hY_&Qw&ij%jDWFi%he_} zSmhZ#;H`RU|JI|k_ST}V+u6KO?Y_#Id>Hs$B~8tY+(|D^yK3AUSE?=8Bu`K=4j`-G zr3`8@riV8_&Xj&c`C^qSw^)D-usbnw6{JgNkOAYjR7Ou>g|si|_6EOhtx-!y>GmcP z$OW+m-(a{PJXh97LdpT@#n06wOLdDva|9AgrPJ2k%+dNI(l|#lGrqiGzgH8yiyxG-b7p!<0vTdBwn{!u zc+3h{dK1PWRY>_-&qvXnJ2{H(P`(zrwzTdw1SGm68r^Kl>P4@{_TLD5XA{>tE$;n5 zVmWjDaSw^z*}+ox zp)fE?AJ@*^E+|UW_7)N1YPds_OGeA828$<7WV--UJ%wxeWZYc|Cz_xJkWjC8y8t6z z>UIH-kcG=^@Rn+a&?;cI62fIWcpK;I0&nZIZtzrlhI(laxZ<>K@HD4&f!m!{1$Q{D z0AHvzYe-y;|$-0(fQM22yR^+XZk-G6Sht`0CeEweLe_XC1gkNmJ!& zXj1qTa%VDB$=9IMS+fbl3s!do$eX(xm(DFsp3>dXgs`7=_YvT*lH|5QRu2Vzs--Fpd~{pAg#IzBG6cL)N#U7{#4rfF zQ7K=u0B)wqvaK({vo3L(#uBzLbcEGZmQ5pVhn0%f=uuuX1JV?-P6xhRz28_?<&*ms zbTlEbZ7aM$V!XSx3LCK6NV>Ylx*(1^w2RcGDQumPwoLkTPqyxJYFpXDTnBFFEmK`R zQGV1!TLwDKAxjJ3*R5rirJh2#&%_S`3B80|#3yU?tYMtaw2Teonv=nIZ2&v0RJ2Bq zvJD5MIb?weJkDC?oYLekzNVuIf$Ml#nE;9I#&VI8@cu(9SIxKiK;j|0mB61{XqKea zA@B~Bj5$Dj-dOI@C#uvLJG@KLrFs-Ifoqhsy(dt*B41_=2n$h=?gBjB0wP`O{hM^y z-r7<>KUoM z5T3F|sRKQ#%BzvG!zx8L=}}q_$m3uKT2#jl$~J219s!+IH~3OVI-7`jMl~EhR-8%E zi^sH@QP(Y-CZt)UTTap->}bK513W-UauJXnb~C#ZYO}mL0Pjg!XBQt!wHXVm!M?(@ z&jr$a;fIUPkR46RG*Q7tIr)8yHBJM_9>uFInmT4KBF!v>y0)izbO)K{K@iPzL|&lD z(Z?in4YY3QNNrkI>IKqfGdFDHmhLm<@7H%U>0NtRga?5AO4>3RU2X6lm0)v<_Swb< zU~SI8#o70n>|r3S750jkWLl5Ko$OixY0ye~*_|xH)1XPk#0PCoJFpBQS~B1OiIQA1 zvwGl`lnkCg44=OKENwS0S*yyB1!P&eL$o9arl0?(4hd=#Cf2L3XvLggR)`E)>rB3K zmyXWqD_4$dB7lG$wxNRjDqOQz`jZHE$rf1!YxGD|W$gl-YMD6?=rQkSUEpv2+qVda zc~L5Pkgv5=ng_&PY0|u%4@Y)3u+xniuBpt^P4*lhZ6kZVK%%@;QFOIE3Y()ls<4i@ zCld1RaMi@+fm~L8K*Rkh3wtfU>M3|LtVbm;)?-+rC}bhHiH%#)+E7mE+Avx=VKEjK zU2}Hpa+(*}<+`yAe1KnW%ad^g@rN-1F0Qk)eG#Z=Vd*j_Dna&hk&~p zX)f@3CCT&UC4bQ(f!tU~2f8MlH<*wi;KND^>x(d%QO1WihF*|+i(|~SQF?m%n61Ec zEvMHgos&Pgbw{`v%Zs@0-YE537Sq6sjWhtyITVc z0v9T&Q(Mt5VkPR+$1J;=@X~m)a0Sv{VWlA(AWgo7aEnE@2K>2_B(hbpe@!N`oFbf} z07w*qg2kesm5aQTE%OxcioA=q`U@_OS@<{M#V;ANf%mJJ@cO~zpTDX@(lvMr`6qgM zPXbw>McXM;n_A?()K2n!9SNPOO)aAT_6@83KhmWV=V|6oS~Jf9{#8j^g-7c&#pywI z&U#RdcHTuvo0U#4P2T&c4p}6H=7vm%YR^a|s?H4;UFhIqZtK}9!41uJs6;=KNW+8V z*}t)!FBrQ)9W;^GDt)JE7D?U#$-gp*m0n%$J)_AP(m)o7Kr({IDzi6H{)O?=`tzyQ z(1So)PF`+$L>f9BB*i-DG={hYB$~Tz;BeTa0^#3v!^Xmvqr?X+%=3XCG*Sad=WIR0 zX`VFUB<#F%)iUfB&?haR4d63IssZsoGaI3rQ-mhG3nH1BnI@tr{6XjW51Y%wKpa`u zbbw}faa!u6W0&n^`V>N)L)5ot&Bs0n-?~?&>Zj&v8kjN5o%YGEXzz#;p!I;NPPFa=%8<&vM1w@IWIqG=4-4rK zki3y`FU+Nx)o6YV)js*BGdk8aUeXkFAhRme%TG(he#inn0wmCfF)g)@9^ob1O(D*k7>74g*=0ZZDfqQ9`y)-fgpvCM-09%v!mHYm16hVAzt@ z%SGK55oT^sm~RC>_|8S5Tv7rVdu96}uT4h0yr9qMpm?VqWl9FpoN}W(=?hWfx4Z+M zx2|Y6Vy&*~?$Be{jR1ewX=U)ePOE^w=d>!=e?Mz!7x>4{*A3oulQa}zHv+tw)4IW1 zIIRo3rPHe5t({f@Z|k%&xazbv@FJ&0yAj0cH|m45A+W5s&}E#FPGuU!FY= z9Y=MgwysqS-aVn-Z6YewW=MD`*UH%Z9kaOx#5S=>#x8kYRHZ$t-7#^jEC7<7zc!`o={osjSMXz&2VqMIW-@LI+53=NS(Cp!rDOWawpZ=iLJ7zIIcC!Tgjx+lPfixKT*14X1;?M=MwS1-ffUU-n1@-6255D@R9)@g5YidiTf z1TqcS-sBYH#ZEeoXaJHmL&$C|w>M#=#lyRIdU@2cPCkk=G)j!~GAjUymaH+b9!&*n zj005AQVV+nh@h5BiM$a-ONo^_`ktr9u#^B_;a^~BL*f6Y)m~`=;MXRn%(5X3yjUeoD4l&u zlfr5xN>v~lrD`jMPnyC$AOh3H040|dEe0?i^JFmqq;|R(pyaZm#lX($?Ox{fJm9%T zngc}5w%Kvr=k8x>jVG;U4S1MEs}HzLNiw=gKa{tybaaD`^>SW1qMy%)b~n|A-EspI z_#QK)ABYR`ykYjb$S3Q^A}4xrV!)he05MiZpsI`(*(sG%_#rG|)?e3@iYo`0-Ge~v z-W^L5!7-z$s18Lojk2!{G%SjbOL_SX=U(VoK^v!v{~xD)UAR~c3K5|s?*Bg zg-&Y&f75Bzd|zq~I z8wIEz+mKRld2^)J>bC&(0`Xo3pS(E*gU>N4fY?bB0ui)nHjL4=aNd%l5$HaR*bnp= zMj$Y+gb1w+uIOtbfe(C~)1ps$BL5F6U;G3jQbq#cmMUpN>8!;~3WzTlF_8XQ{XVj6 z6#=Q8ju@0&Ry1P7vg$>$>IHU1BgWBc&jPb+2#Cz^OJj0xIn(#0%j;_5>sswDt6m3A z)(E9Nz#rCzj-%<~&(G&OKNez+Jh6aQL=+4eyQ@Kan_;~`7gWpJQjpuTRlwmUXbuoT zn`Q$P<#yhZqTF7nv3j2##SY*eny9ie0Pbs~e&9Qe6b*yOe#B(=0TGyH9wnC*WgfD= zZ?fvZ2aVJKA~3yFq2%JDWPDO(Of+xmKx%h~hqTgP9G5Sb>#Ia#N&09GDVonGlx%HE zYQUGSgjpl6Uc6+F>;u%3FY9>Y)zKFn!l@ZnCYfRAum6?~-Ay1+*{tsDHQZBo-jZx8s>PU{9= z<+LvFXPs6BU+c6A_c2Rv}S*a#1Mq)9+wTvXwKEfJ;fTi7kHME(ywWFl0rXJTQq%(B>nW1<^iXUvpkps zq-E20F0DnwmCu=#xZ%@xE+e*lQ>UN1$TT(bS~c!8i{Bvd!|Q3JbPK7tk;c68(?rr0 zF0rW3Za{~m*^xvW%T*gKcZapyTwqnuVwAQ1|`6P(r_GvMp9zmfaGUg%Dh%Nq zL6Vtf_SlKPWrJe7Jh?|BA*JB@VTOitwuN;LkYLEVtEfL~QtLQf$igsRRDJAQEA5lt zy?aMAG^~5YhvvdoSbqy?^;Gk{n$Ewm5p)>H$}hY*9!)CklV=^$(S(IoW2L7mTGWD@ zzROCFS~R#B8dSkdlln?;oz+_PCYoRNnt+}^L*x(9kud_ug_2YRGAvK?4y`twS=xI> z`{X;OcQoO_eDRsikNrNBQz>u!Q95*SWs_V9QFzW0x&9Z0?opkXqhEF=^U_aO>6hzK zSb(2Y(l(hMA$wZs1x=H)^qcK6T$u}>D9eSfD21aAo_9NJ0pT?|We*F;!fAqtZ&L73 zH1dAmpd-|cdJLE0;9Hzl2H)zm3ixYItAcNLS{L~1PU{ALwvt*DF2ljsIISCeozuF& zpL1Fje1p>};2WJ*27l3M(PcO>`GMLi11OMcl6)_$XcbGC9lVZW2KSv_%ac4( zPc68=ueA;;o!zol;hE{1Bn}~O>eSSYZavBkV&IUHWThl)$K_Rf!l%iZ>6#c41K?gt z@=9ppOmi%U3~q36hMY~8Xv;Gk`7GK`n~p}2H;#aZTl)+EiTJ_A4Xsz`g-I~IZA{dV zL@S8IqE_9)Z`o{akZD(6^f=DY&_d+tOMVnq+MI2TYC8>v!h;?!HL)b#Sa6AtOP8BV4d4SxI=jw*t|~1XhA$s_7KZ1>vfl)2w{Fd}B6Y?NSLvQkrkBTG!eyelR2x;+G!Lzy z@G)!rKHwsqeKrn!ljQAF2rFz_8UZq;?^PUY?Nr)GOXT6Hw|8`$DLFws+Ul@%)GuzS zF-w7rWEyO~HCR88@qbnA%k|yjteY1YCu}|gT;n0j1*ds?};+kOn!8ej$)Hu zN|&BJqcePOpFFwA@}v%A6|w%Ix4jAPGEEY#Bb`(;D;loboA6$2xmE`Z?Jg!ne~nNK>EhNKK9#i>#0x1{p(|Y zMkp!rO-qsaK$^W^?Dw1?;L5bzazZwXqmf;hG|CwZ^5Nuan#;!I@|40&)&YCJs*rHV zJ`TqCf*{%(frSK-PnzWo_^nDjj62lG(ct@vogLiUT7kFoCr$sv`1n+n1gzTUIsg|rZ z@@W*;>no^t--`9us~6O}JE}LZeJbhDY3WgRY=D<2>4efHH>}_`lib?6FWE%7n@yBf zC#O$Nrc>>+ExFQb8`<(~qHm4rohsjIn)3YJ@}rQG*KXR;DW7?eK{qTjVCdW-wR!O0 zGEkRbg__XtA=UKJ|0zu^!;xM{wLCrMp^aQvo=_tXY^N!QfHfs;F0T%ThbpvDn$Umf zRe-PAF_p4YQe{QBtE{z_hkL2%1y*Rbl+FLn*NocDGO7Vwq@)vDhEW$jE&Wf|wi}*P zXuQ>onG3wb(rkHY@fC{ua5BD9C_(7q!|p)DC3-e(`rq$LS5(};ePW!uB&B8 z(-mUN(_^kCT5_egom!qAvt;d@a?x*+IENtPFg?s6hlLhTMBw9eJsg|mXcnI zNiBu^%dw-wztMW{Tp%60TnhUmE9C!tm%qa+0ZZEDJMxwCJzn`v)uTL`09>x5@U{BM z`|Z)Our%fVpLKM~8^dyKE1R567(S+qGfWrVqo@|#pVC@A>!^jpDo;M`HKpUfJJ64W zhg8y`8!l;i7z0^K5@|7|o zFVAdxCP9BGY7oy-sjn0^=vU;_gj@2JNN9_(V2d=H@y8112e=rW}%ldkQC}d$FpkGI%c7N zQCG`g{V$EAX`GulJV}>Od$*p2UaI3QJ$@;IBx{q!o@Pf&ng2^sly!NN&@rJe{y!GN zmN82oH*9%Ye+)`*DEwb<1)|S#>MQ^MZH1OC_EMI2$za=3(*I_6(&gD9woDrYvbNi@ zw44=5esTAN*8)!0g^66x0cdPSRw~oi06tHngx#JXw8n-Xd+w9|U8MXqj$ za+I=qJp12K9xY;%+}fZ;YzPE4u(n)U%B@6`ILsciI9>j52t(!x+_c4`m1Am&L?p8y z&Pn$c$*(R?(pBYYdX$^IK-QSD;9P49&R-kf5b%;|sZd#PuHB#oCly#_icTO)ovEd> zOOwC-vas#(;DgETntlWs1}5}lm9gb0`L8Wx&?@^a(b{1h>&}-lTL<_4N33oso9G;Ou+4S7KxW9TN)*(h9n!oWPSr!uyle-IFAQ;TtbY;7O) zeLl(7rWOPD;TcbLCI~j?Cnt|$Zo0_IMkWLC(7z=+nhmn5P{CL~Sc*pS#EpM#w9jhF z59aUI!TA~+r0YNi^Fv#2-EL5-lc>n+(ZOHFaNspcTE{;6OHtLbYx=zzG_pe=&-DSh z)L7Np@Bf{3baPYf;)hySp99Q{5Vm(l;5qlASNs3idlxvniele?=V21|Bw+}T3}iEm zI{}854#*=wfbdd4(3#21IC+DB@=#1nfPk4KN4<)uNH~b-L08m+;u{Yts3@Q)zQrSY zQR6X3If@UCD5Bs6xz%gcw|edFwf5{u0($=c%jZMpw`z4)S65e8Rrl((Ht=Pd(}{-& zs|6l{l4Qj4oEb=-J2TvR)UC>d0?hTj!-Ao!NRtn94a^R$CTWY#+HhKD)hNznk{#L6 zGo5G;jfruuO^jY34_xZy27;j_l*OpzaU`SoJR6Q7AR{%klGA>|UNp~H3tqiPTAn1j zAMDgQMV@q0skG^1&C)rOJ@r(LCvYRFlJ^vVEscUUHHd$d zjN+xOrL1G_6gS?QHV+x8_`6%QYR2kALXbCkRfdnVaDQVlYMm{cqSv0 z4Twtp^CQNAJ19s?crO!aLP|6`l&H^d)jqS=EzT0yLZ8QC#>qk2XMC(oNFY7S?W>e^ znj+qQih4b-VX+zY`fBYpjzIhru!UZaW!~9ye(Yaz2_WN`&z0#m_XrJACR{N`z4~YE z6-ygQje#xns-?6A@o@iSp7Qn&5XnVi3)EEOUanW+qoSx+4{EQD((#YgrGMqIJn(%+S`H*TlD(&!qf=p+`y?~>As}aYo>Qt%d+;gw ztQ-DX_5Jc~8R{_}FD|d&QV_!et${adA3tGzT?*uYg9P(UxwA_?k}I>CY$R3}?bVr3 zfsi1Er6Aj<#{@1v39% zRjzlOMyXdB%fQr}pPR8yr#T)5{;E;|wuj>xlZdH&iQ3COW;a7X&cew`s=;m=ZJ{O` zJJsiRcP13a3Z$B(q76sqf|_YHiem(_0CUwOdtmTgEpJ1$v=*f?8L73lu~wr6WwkTwFXWD=zQeU9Rwdc~U4q!I@}^aEMkIg#t`ai#<~RN(=|$p>{7dm?%t# z-Ek+P=?(T*=VJS~vJOPwN4n=xKAo&zhYn zOU^o9KaPt@N_1zP!IM3$2fTx)b%WbHtqVNO(>lOAdRjZU-P5A8&M0q@c0!KI0I4QQ zzinMO_Hn&|f_iauitF_i)VnEa?<*?bbN9lomjhp{Bw6)8F~aFqIqQ6Lde-?SJL_C> zb9P()taAdlhpeFmz;AVBZEsscq_Vp|JL9&W{*~DSJW@&1D{I7?$mu(M9~JuR^!`ri z{WP9Ygj=W9(bH1kpOvJwTvS39ZeeXwL>yAOV4z6G&i~7Rpf9nK4ePl0mML!$5ar1N zxNIQQ|Cilv+@0A=bwGz@PXRc``n~{22iq%a#38%qfAotxbX`h_^Uas=ea_H#)D(}m zPA&z~|0bQ(6>nK58xBdEG49uuH7yG=U<>+esVVd@PxU#Ze`Q+@c#e{$%hN=cOJQr! zuhsivHSSq=z6iJ8Y(ugLh~lXwT1OUc<;Fxt%%xS72*>1CIwlN&245+?q*ar zULgknH@-#wfirrzQadGa5BMJ6&-59*^c7Wb>z&rm#XveE{Y-1E^=)yBeoB!vSIiX& zJNlG%bb=XQA8?_PWF}s{j*A~#xd9-(KTy5`BL1>;IyRi1N{-Xc_nKY?fpmUGWsO^~ zuh}C1go-)96f*>*_xWm!0{4hPQsxO!_nO@E{v=dQw|4bV>+&)n+GsK_vjny-PWei#E(?pUo{0T1EM5Rj!SXZ+$sN1je9u--r&mQP5>vN0-vvnJ5B$} zo+9x3N)p?;ejOKEtXwaUP?;Wyz2Kovd5-$vv(h86vd8U?dQf1QYEIt&DRG6_ilXGE z25s$aTTx52z<|j6KPAk@*isoAT|1ZFZhZfzQ7z1_X-$M zQ=7b4xQG|bXCSWeHK7d$T&Rshy>JX%g0LU?n|k%!9px;51fg7VQ2olTsS2I`%BItq zewqN8E>)K_O%iuKsh&V%hPWx@z5wvu{W^vF8aZiDZ~Mf5%WfbAD%*1k6}ChRpVo#;XY5!KC>tJRzDI}Wp?`eYOBK*kP}B*n)=9Th*(4V=6Ja z0*gU|z*lHE*)`7aWCJboe5BsEG|8cX%13bo$6U zGi3ua76lfzMH{C*ZEeZV{Yckbzi0#ZaLe}V*LG1*G{x#|9e;JPjq!1vKzJtkpZ{lc zqEta+nLT+u(0`oVJ4>A$=RnGAxZxFDXQZXFj>Xzb26GI~%Q?(isVrmGTPdfp?D>pA z{M7fR^X?4wW*;-J)(_lMy;?omw^$Rb@9PO==LU5o9n|DIt0PIPCF7LEd&+tW$R>z8 z$=$a43oaQS=}6Z}lIzLuH6|4JgtjNic)GVD?Xl=7sz&jDYo%K1oYK}PPA-2+)SC6q zqWztJ?JN?hu3gc7z>)m^CELI`UPCyYX+t!?Ci-Ay&Af&^qi}1b-sXDHSjG)SJziww znt?qljH|+C9E*T!VaxSsfzh_|o1L}d#)DNyR5e|jxTkhWCHRjuJ@Ho-@SE0gL4H3| z;(zt1nG%fKcHf*@VS3(Kz7L^+kwCdmykS;YkMab)=Jmu5<#F@nV)c|?rtPlZKJlg4 z9Y$2w6$yCgzzKvPIQlO=^8%H+&apV*e4ohwes3PJ7l@Z@VXvWPE|Coet>pF#aEZ1p zrG#2SVH}~HW&*NdIl))20AUPJCjpqgq&v;yAgc)x;Ll z9g$i>aXeV7KCwU~@riWB^#hK$tX6$u5$DJ!<{P2`wnc_QXI1E#LZVY@>=g6uz#pgh z)@UEw@o3E}N`MRYS7M)-w%wXfl);RABFmGNdu7g29(4eJswBTLQ%j)X1LUk9NyQgz z3iSb>qmg%4Sye^b;qnzVy^YG`xFitm9Th%-a+^#o^|rjL|72ZV3jBzYPTfYArc>J` zEwCiMlyB~~mKG~(@2Jg<&;p6Lq*g$N=>ubVyz%$jA4qu0_6@V8lY^6D#s86qW^zu-yu zG9G9Yd?uM9$X;-&Wt9rhX7iyJ2xB?2QnFY}GI!zs4ZGuxtk4_GP`dcUh_8|%+M1C& znE~F-)7rtaJgoz~r>Av+J3Xx%yqBl-fcNpVx!@D_%Vd)yD_0zz^8dy2l#YPYX_gDFR>7Idk!sAk~qDLTvI>JMZbODpL4@K9Yk=;&xbb+z*U>1vP2w90fF znNL|kw)^kPk6Q2k?rXyJEm%>YxGzKd%)eV%<41sjd25c~DsW+~oA59n zkNQ*h6@skjI>-N#wPv|NMJnL*a~0h|jPi<9ATk`{TP&*R#M$_@5jh7xwX4&8B-BZr z>B0YtCw*#8Mw7E%z**`bcb3n(+k|!xRo%C{xOtIz;343f%md38B)_?b`;@{?pH2mk z$>_GaDS+pkU+OUn462YLobJ%3&mSwtQj3n=O3)da{GB%a=+oVFsi?Z&o11*4MRmh_ zb8eot9q{OwysJEWNu9mel?-b__i?nHr4F`aOiN`g8G+LB&#W3s#fSq~gTBxc0qNqW zQD0-0v9!X|sM~E1GNn?NSde=#d%XsuzgbWk1`>RBs<;1$M~gcf)X$ArLTiM4c}A(l7x*F#T3vCqAZ}CgOIkx7SpbQx>31N1`6Kro$a@Y? zzj37}v?=gItvlC!2hta87HNsb^1&>(jDrI~_c-PB>hvt@jEB?jGrGoG;prH{=s^|j zd{u;x&Q8!Ubh?w7xyHiVslB~7hteAv>41nQ4`1t2@Ul4tk|>`QQyvb8F6$g0R9HVR-_n8;9RFpXS<@-cm zi0Dlg+5h-`D%C-}ye%yntE=90SH1N`d91(eS%5RGJ2ajXo8@T@@ZT&HF9Na!D|@x6 zicp^R>eWcZzn+M=#fQ$g3>Em}R3ISM)XhQgpTR0%^$+J(l@5f;f} zbQE>+?Sz5je{0}4#p1wXAR$5m$DiWBvDsGu5(p%4_zDCLZn89#PZ z5SViV{&0!qj}tWMli&bkri&Z!6+$<_l#+TsP}`hrCNl`cz+|;)dyT9}x%Zf_2E-m@ zwHa0mOpTJ9zL3XrWvZE{s*wX48`g2L#Prn*r2CW87bNA^njw&^%D4Z3XkkgYW7+mZ zG(o}t&APv`1c(x+%2G@=RCTcr^;lEw5+E6XJWBQzq?6Fe4CIUx@TWSBtFngH_-zx7 z$lVbw1u01h=DX3$S8;{GGg??NF*wyC2QGmO-u|V77o~SL6xf>>)1A=~ zE865at{esf(x!X>p=|XKhl}LLI`9ve0So|hf_$x15H^VA849okL1N2Ic2R@EBxEW8 z8D9xAZciz<+>VB_Jsir?QDem^n@GSG1dns=q*DdQ8fDoF%n2TBnM8t1--3ODQptJZ zF7pW3g5+_UlpLax^F&LIn*wu^Z;;8KI~Y+Uc@S|T$#+v%NH!-80b7tfPKxX);FIb< zoMUiyViy>0x@Wqkdh zx)jG1@kvj;`gZy5f(_*^Hk5-v6#kxqp|p4`Of#RD8`yev;rPxb3wT#2oz#Bl>TRd| zS{^ZXiR#?=pi3XdU7bzRYWhf5Z`Z5eZj&w`C*$|-0>g;qm7z2?Caxd0Tn1s{uJu*C zxNf+|BralNW;euUc6)=kBB_fw4blciwyv>8V3Mj_>D(oGX&dX9AF_5*<%UMfv1X3y zrbmLgILu=BvZEB9=1FuM=U4FQLyDjqIXNE+us}BjeyM-O^8(2i(t~>>jPk`gf2ucf zu3>lFQFD63BrME>diCUAf9^yzc*xV*!NZ=`0bb;3UEsx@)(u|nX+7YVdD>j?BhSf{ zB}dI49LL3|W$rXYBsU)rC{6S6ET-?Hbq=@*!Rrw;}5bvP+Im=YH6i8>~Q(k4-(RD)E?Wu*z zyXydyHw;9d+u9V0U{HQzgR%tpS0zoAttvT-p_+qQ*CCN1lNjgkLuXt>vvPlxi;l41 z*2Okt1HfDTkWmXsxy8^aV;31H!mZq>N{CpMFH$zD=h>((05Yob@xPDCgxGkS{6iPG z_bwZuK_DZPuZDpCp(-7(%9CgSJX%RJDi^!NV^uC`NVwN$3R?(7EBR`)#y!+R85c4s z!@Zo!Br>nc7YS8%xvJ_&>-%Ehu##jG`(Mq6Bv2pp6@VyfdcMLjbF9ZZT8|e4_f?Yg z#_4F4(-ytq-d(;LkdE%E)ufkNtNP1bIumZA2Px)suqr4P>f$if#l>bmi-9*PN$kLF z9&EfjXFlBfSJTJ>AR5V6qkDf+^O`IRc~v~J~NeC zn@!aNKvXRZU5le|rPs%*^8dxu*$+f#q6inFR^=>{Tj-1;Yn!Um#iLcZBB46_RcFgg zoy&mqyGfwPzB5?b?d-Fjp&tKWdh7+F$8Bv24P)k$%*+=9cTm#Q%HmAUpl)pK@&eW zB`pCGW!_uvF5@Etx7D1%z{u>(6_Q>n?ZF_oUV^wEE4k#o`g zm^mUnGj^HH*yX^hl{7m_-J>ZeXQQ?7w~fzI;IEW)K$K6Kuhp4clU*WtO>EZ8&V)+4 z*_>VqBvqIs*{wSh!S!jrDDb^TS_H(M9~gOh3%@qR%l33bESp>jweC`e)b<`etL+15 zt?Fx2>p!*jvD)@1wX-Z~o_Qme?xfPdhwv@@f_M{#^HiFmyeQ>Y=H>1*FSiUxM)>M& zv~nHsF*uF7Wuvb!f6)(IXQV#hyOmTGGm%fSxcQnuW3I~c4ko}^X1L3M*kFBB!>yaW zVvO=E3V4W)`egax5N8w#gco@01P&<4Jp)`LLc8M7*c~a@h$1X~*9L3}@Mo%qIq_P^ zJ2f2*`Mq*2{a>cfe&FLu>fOeX*V!dAw|eXT@;$100%u0$%iFbuv3U8i?6jq5YHs6? z(`6_4Db4s-m|ZOezDEaH9Ba5>G#_LmLg8D?ScZW(rCE_Hb7wZbyhEq+juavzqOkWp zxxy5}!R#M9D$BmCyV?+Sa7t1)bV^}*WkQAyh#i~HsXa?hwPl2hFPo9~1F;-AOR!}` z-V07xt}j;Y3xk_SxH!j#WD$@YP#D~tG6*GNhCOACF9*{2m8E9;j3;y!*0Dl4>IkH( zqLTZgT}HY&)8_wDAl-cCJ%7!*^LZP&B|z+ZbSGW2xqzu^9k=w=`IcoQGB@Vit1=q*jah_nPF9a7@#{2&^j=6bk9o>Ie8`<5NGQiF z!Xp2y4Ig5f?gheFp2(EA`RIvE*d6yohTb5$bn&KW8daW~2{xX;@_SX_9Xzca+~#Q= z;Ax)L1)lC{-QXQPtp~iDr_BY|4$EYcCo)%z=VDJKx+gN=PEYFrcX?VjxbA6P;5nYw z0p7>c+QIvJTJ%H)Bgd~Y>5`+)Ng zM%Np!9^v9jCC+jmKRj~BPWdeC+kWrfFRfl6FGxuuzon8fXsdJsy9niWfQ!jMb^V};evPWC}gM2o$m|sMdN5j>}dh$Xh zaQ~pT(m!e|l91$u&KmK=f;Qm&Rc+(UF}Kkr+Hx75HXODY^@^5$s4ZTE-X(du#I1mG zUad%zzB}o_tR8FowEH7%f9)vkuioVBp=NTq=;Ft9TctsYss{Y)OQc!t)|I)Fm9?tV z&C?)T*icocOoD`@JSOSd#&KKi#xR!DnMjcqUCx|4q??VYXuH9tf1g$_DBU%+<13nbaYS_yJB7i!cBV^5OFp3hIafKV2%8u9>{kYg{A!79aZt}J4^Z~>4khpT)gZ$$ukb#w=>}; z&i1I*ovfTRF?K00c;MegTIW^Tr?Gfz_ahfs?^1CP;~T2NJGX;4WASM9?bE4TkLbzI zv`6w{67UyFnpk=DhBFhco~z#Ue}32L2{Cg*>oK!*7`D$~>I-CLVK+OWs;iD#sVrl% zbD6)Xg%d2lYb)0Uz`DiH<-m>tmz_Uhzh&w@4h$_N|=f zxygARI1sINm0&D8Y~ncG;T#FY_3At1c`&yLKeMBdkh++xl3Vb)N)#rZ99#)QQ5X@U zcBx8$I4))ptcPTCurbOS&r~KD5ov^B5JIvoZB{Nd+q~nvorlAqjQVnsI%BR-|} zKbBmYUC!;oEKp1o5XX?5Yp2V^ijsLZGC3WW)f>|S>S@(Y7~tinM@!sZ)Yq-jO&Rww zEp^zyEoJuiHN8@?#u5>j)(JTeVesU!JI&_tEQz>n(;tz=Z`<8ByAJ`jEt22*lI7jDePvb?D}Q3 zBvh2{Ftg7aagMf>Pa2i2Uo@9<4cE?RHsjjTer>oG4m1=cCTj~4lT=w@THq9(SKW4z zCd_!QACoj;c4QmOTQ6J463a@$#Oec)r14T+Os-IiVIxnc++qGEa)&zwZigk@b`A@r zqaS8|CU>xlusYa#&|T-CRBD+aOVf9lCjL^>LvlhncLXHalkXh>uhY!2)8}hG&GXN> zqx|kHU%u3LZ%s_iH5u+oT+#Z{eUwCFtCFdlWMK;Q&A+c?r2{aQ?12m^${wcwBV`X; zHFDcmKLp;7+2VQ;kXSsU5-pMw?h$omPa8-8KFG&3Utc#3h>SiYM}gLTh*0Bqxc^&F zI}E5t^e5+_7Ehv}bxzbyanNe1Kc%gPAxBzmDdYt4 zp(Kg~yAQ;m=!o6lG+>OkjpsffD~NQr2*b~v$htl{$+fRCp{Bee|3}@JdfabN0duT2 zm9o0h^w=4z>G@eCj8605o zt-;Z2E!t0O@d#4B;|C-VfAjV^oo#UG=sY_$QlzsWzbw@m8I2tD1k%wab}*Lw zBB9^7ba}o7%=KxL>ywN$-R4%#wgbOb+9$R_{dnn#)fBDhS(U>~_? zoPw1_X`c==UpN5dx#2Xo0pK1EX4~(Ozo|8Lb6dlc+;iZkdgLR>>ji9jfjkN4{`ZY@ zAJ85@mQ>|FT9wxl$~*>7CGGiT%}G;t&nQ!Yj6N!dnn<2L+RVhqs*W`Oz6{9I4N=S$ zBa>uL)HPC1Ab($LbfkK7uczH{MCYostF`L7K2Z%NerCKE0eMVPUYQci>DT6?%)xWQ z(+fV~^G{W3Za~xFOl51ON-mPQ2Qi}K>}gEaA!NZeHx$U^W|xX!S!8pOn%8J95t1;y zMWW3XZADA?d?do3l}j{wjfNH?9fcnJIGqhH#jfl;EO5o`6BCXjo|mQ5hxJBA6A3Xn~qR0>+3VsWz<$jtux2*%t# z#pd5qAd`5SoS4gIiE}45x0!sRdKnovw`c6>=C=5OT6JK8sGbr#X&SIq)6@AAH?}GJ zt(cxpoYY%qG9gP%Ws=9SKxXbgf|$s{+}#>45^HWuUL;T)l5C3?X_RQpUL=qx^dg^E z@6l#+Yyij{+b1>T)MZysINRTBQ{1m8i*O@i#Ha5rmdmV|XR~5C&{j5S-Bof< zXifs{b6R}oyw6XKPYQAKV6(g>Kt}t-boOMAOqa@Y88( z>fWqXLaqAsn#c|_2JD1UnKm&Cu@8oIGOLZu3xpqRx8SlPk>o~fjLEm75ZqyInQQ@;kz-uA! zfw>t;KAG5zSJ}~;cQPy+ zAC`X@0q)IFb<5TUkP*mNL%@Dj+L@-$<-kNqJId4Hm2PcIQ`|sn(kY1x4Mpsh_S-qq zwZ4xT`i=JVWb5e=@SDD;e{wy2EZ0-+&9|No0dqaIYV`D#+MV^*(Q4OY-CZ_$#lDC!9Jq$O{{c2KV|+ z9mBw!I;Q^iWxJ6bCfdV!9Z z_$MHOiO~1CL3~TWAf97F4+0TdJ{RdGy*gaP{hop0TLYv_L92Q(ob0`{8Hg9q{TS9qur1eQl*K z@75#~AR*k__e{;Huo}g&My=+|tXVaRW1-K>S_`UWy7UGeh)iV`L&8ML<`YvVa=L|@ zn-u{QDzj3OqjRk?Nsl?@0!Y|Wy*jw7>^B7L!W^nz{q?@-K)6vr3UZ9k7E99-%dHbn za$NbQ;)~?-An7XrIWHY{uU4Hczr+$!QE#-6f3bR$%gwVa1Ab7Q$Z)(S*goDMp@nf4 zB$oo`D9O!?>KWtR@9W<64Q7V>m?H&nueY0D&w%$SjzY&8+ZFI_gDP()Ycbfg;i>(Kd}W9=71yu7_!wSw>i=Sl3b7 zm(`cNDyqNPDQvCTQI=N8Q{Uh}@~3xL{*qmoINDxLrKhsA)hZPJ#@i18-JYE|E_m z*W3Q>KKEjaJ38dDRPD$!BcJHXaul{PZ_5o0K3^2<$4iNSC($E0vK++qgdUKH$X9L5 z$eQ(}AQb-{#w3!}cZ?3Pv-sT)EVs$xEI*+!C`Q?~qzBMJJ&rx(Zn)I2zKA`jW z58JKJQHqsKyqvWEASzg^xy>Ie$5{Y;Tr-wA@iUYxkmt6cvK0Eo5 zo1MGA6w4oQ&YG8;Ex&6Srk?2zVVGuy`)=80*1s%M_;-XV9Xt9yT(0_2L_TCgZr z^p#yrYLEsUp*5o*8)t5fj9@_8F_?Qig5MI+Bfg{NQH{;Oo=CrJ+nUM6Z?c-k_GsrV zIx1_oTYF_0g;@q#)1h{wg%s=`J$GEBK4%}TDmmBtF-a2@F3tSL@)WRE{frz;EMt{@ ztfFi)s^J7uq?3B}2{{?*6o}$T5N|F~VBsJTq%f?@}(@}5H zAV;^ydh%w?YrE}n;}T$-W?qutZgKfu{&AzjD;?GREu~3n<+&x0RBm_K3{2;fq++SZ zl~hkQ&eEBvZIMr%8WwGm&Xr|=${LoW3@?ul>of>8hL%dQIBl2)*(ZBhd;+Mk;UL=k zFd2sUk~~J+r9Ex#CNRHv3H{$>{(UVv|4S!e>w0M z8qVc7!Sy3tu)id0DIfv(W$}X#QIC5rROWVCJ4d5Ygk2{K_yp36<94Ij`ZS0^^El#l z&!`wVN0TML_Gp0Rv+NoIXX#W=N0JNHnDR*vAgdI4P9M&2+g&YNwM858$2Vcp+JeNE z989bEQOa&&wYEYiHUFJRT`Nn0e^AoX^~}4L&;lV{{5KGzdVPUWSthO%qyBUUKQpb< zEMhGO9;Buv=WIrKhEz)^i?@_l6M&5HVX@;h9~lm@cahPsvZUb@ue1c*-$r_YLCuV1 zdTbgAS1j@tZn!qtMfS0EG2u6`%`LHvm>uuj#g!XPUm-71fq z4`Jz$zyt$4Z7Y~XiCDG?l)O38m>gwcJ5#Z7n+t=N>9r^OQzaQp+AXQp<5z*-$G?Sa?&1w@<`kZX4m^RzH*P zU&{qbl5Zn~BFNh>A^%nSzQ6=ahi{3_Xu% zv<~pWp4JXN#M7d8p3uqZDzCir1oYK5&JRa4t~L->lOcF;-RSlD3hLdwKCE|(iZ}b1 z?2f$h1UySg-LAb!lQ!PGeo{T#7O+cw6-g&VLXGzw3$tP1M~=%#qchV)A$de=Oq~z2 z1;Cw^G+kDK*G`mY_O9)355SL^$h?~k*KEY+KKY^ZZU#nd}jjTF{|DWq^~{5U`O0L%k(!0%<0dnh5BnZ1q=aqSCYIg=eC062Z42- zas#c($BBR+);g2rqiofycIZqX{M`8W0ny=Z8UGb-(+S16s@z9^QqD!|6)tY)%T zjll_9-$h$J+FD-%e20>DtZaN(riXvih#QF4nF|N{h2FFVgG;$xP1FG(q6!Pwh7T)^ zU;2$Kx~8&qo7l^MmnmshUaIhw9SR|ue3;CKFx@lvgvQr$s58#G(+8wGt*|Q_5xn<^ zb!`B6rIC6K9-ED*nAY{{$LYlj^{+g^0{&J>vdiWBmA&YdAFC*s$TvA8$fs|+m@VnJ zZZyxS1o?i9E1SLyv%~yMu4n6CdHWx@T1oDtXD(K!9wD8v%C4SJ@=9Z}5O{-jttrnB&fsA_b26 z&Cjefe!^n$>01vf96}M=-}STz7e%BJ%{7;md;$j{8)U$@n*&$?#5YWmm%t>7nXh=z z7X{)gp52(Ku4qWt>TOSc%sUElGI3{;lv;Azki2CzC`mdyJFbyW<+4f?#gL z{d%NU3vSyalc9A7W#D~;dJ*}`nDt8S-ktQ>rY0kf*{M&JfR>q2*Az<-F_Ev*rU%jF zGhSQP>Cv;NLrkY7WIIc>bjKKF^oF52^&&^NQX^_7?EW`bF+SiIYZ3oxr-Dy7GM-00>O9VM$P zt-={3H3&C)Y(n*#l{{Yt5?PLo zGb2t4G+V@yC0c~SEYFDfMHZc%0BDIlZ0Y%u?ZQ4X4}ET5rqmx>p0O18Bh~X*S0lBA znwYvcB_O?gaX~L5drTiSH&dds)$H6#Qr59HbBxP@__bCNs9Hj4T%2qs0vWo!LVn=6R$eYXKk$_xxZDFA1~lz1ADE_Ha9}Ua!7)@6H5HWaB5s92-*bmYBkf&4cH+ zz_cOpFA)}g45%E9lP!$=(}rlt;N)$EbvUd%Z{x|5Ow4OE5Hdk!q*+xVkfZ`3qoumT zS~0iL3#3+CZtE(Vo#9h5_oOmxWB&0O}l=bK2Pfa4|!S__$8j!4IcKi z9`Kt_&f0emCBbj;v>xzPp4JV%+S9tg*LYe7_*zeE2fy9Zrj+UAZ7Q!klmz-}@k2>e zNm+R?1f-fo(+%rKZ?3PP-fdC6->Y~_PsljRLrLHYCCPKd4eRBh z90@fJJPBrtUas&qBP|4e-bh2h`KnM!JKWQQJLM?@yt#Fv77^mF(HLPklBu}bp&oR|50ir0` z&i1<0U$XLq><4{O0ChfaBFY^GqVHDNsRojjs{P;CDD(k$^rO%vqp&GA3fw~Vvil4~ zW0T|zl*H7?NuZ7kO&tq>bgk%75BKI-w+DfAJ6|pA-hI}+MZg2Kd-5F6?LOsq#uM(* zDS2E59MWpj-1EqTUnHNKk(ZO}31p0}mgB0zHrW?g@t?4AMq&@dq`zF%fwy=yi7^6@=|4QX2|+nA8S(x(HcCTzQ*DEl&y@Z zOP&9=?(_laPAlxny2gZAZCx7xKBXjy;5V)3;`=7X5ReIWX%j>6@LdoqD9a#b3`)2)?Vt3#YF(?M(P9NHFEg`!^SO! zT#5w#A)0H9?5AvGmjUK~`eS1RGpD2#01c5+=W@ozSZ zQ*ka=3m`v{%@80KkWYY`n7}+Sfn2^DnLw8g{TwraKHw*nBo6QT^;~?;%Jl-7gp*yl zNstrWd~c?QUX5LJk>%Vb}FeG zIiGTO8&>&sNv-N>jJ;t(>lO!@U(XD)t)v5{0mRh7Z&{3qNlHEA7noX=&Qy1NmSeC z`57z8mw<27*3$hXF5o5QeA^j{S@jjLx@~>TsxM@9jY{)JlWI9|=NDv!o9#NaHS9W3 z{I7SV>b*e)KLjLbo2!^j4zvkEC5b6 zweyDt?tl~ba;kCu-93AtNH}jkp{k)z58)2B>q04NxBt z30q-TChZQ|@tIx$z{D$R(|RsGYUO%?c&C|_Rh7029_p0i_YXcR{aB+cTina|6hQ8I zxgZ-Fd*%yO+Cpw{xkwdq_E@<2=svqd@7i?G1sY?Dedg(F)Qi|uH@?{H=2N_0{nczn zBVoFK+pK92_;V$R^Oh+qN2M|YbSEpgg~7=-c{r7^qv_s0fVU{A>Ri110G>Q|NuXgG z&UW0F55Bvf+lXEx>1e&}6aOvCPzvA#TDF}+Zg9b4zOdC{j66<(s4&GqU%k!DTOMOm z7j0vw?|kND$O+qgYU#*giuai*4g(1#L}z><^mRT@Nux9Op<}0F%0y?1gmz23!I{bV zbs#n>hu?qGTuv_h?yFYa@z z)uU#LduZEza~gZaJzOs8p#alb-gpU9*}{61XZkj;C(~V?j=Ak zT}NjvSGt96SGwo3RgTu=u0? zb(^u^38!V=UTE#$$)45$-oewlz*SG{2Df=y4|wJo*2Y|Lho|*`_wclCaLv=Yz@47f z0q*j&c5t_+O##2o)1u8-^wgn!kj+@2uNH5{Qtc9}HUNCKww7+PZ~?D^&DfY#UjeJz z*2k=(&DbBRG*6gRy}%t_n2m>g*+y2Oxg&s4U&ts$ZPel zoVNo0)JTKCX{sby=1ArukG^%w2RfaV`)l*}Gco+XKhmBeyBvB1{>-{D1f&~sAjOoR zfl4ws6=6-(kp*<*x7LvXAOcI?)+Jkh`CUP7(HC8kHQNyVQ!;nl& z^AXt%QK>29)iMY~B-se`(q#2>ge<)nO}v9lynf($N;)yeJ{8WUO|F%aX0;df1ZG$J zc7Sw8{KIC zTGvSaOF6o8WKok^zNrb-66W0JObvZN>|Q<*lsXUXgG}M-OS?J~ZWDI0FA2#CHtQ#Td53Dp|Lm_i6Q{pvJr_Nu$N?Yy*=d z`d5--Ahl$rXHrMI3b7>dO7Ch-rLXa;oGIXIJ*^#lou_qxulKYr@H;)N8~iR$>j78w zMKyQq2HfUpJ>Y4c)(zg#)4ISrd0Gc}XHRPfcX-+q@T)y7TIr#u_iGT_#3c^gRuTt2O}?=aB@fd8SS_B10DJ!Glg?C}YAP;(k>POCTE8NDskg$m?|14i=$uPESuDJk2zku&o; z4$vp6bIYD}HEf7*3#-VUbu~REg)zL-v_1fQkCNmdLteMR!nWa_CWrar+0KCJ9j54A zJ`9mBt!YM{l+Cyz&5zz1t$58ZK=bIR;JgXGpW3n;09|gj%LMU0{>zIwG4;^5^#aU|7vAjrS0gu3LCjyIl);xH<0SG-5yTU zCp1bEYtxX<#p_Hxy`e1@BySxmz<_mW0Ely*)?gk9WV*Rypz}zPp|nM>lQO zJ*^#lil`5k)tp!Pw`4Ty*m#(~ExrwNtI&P%vBU5Qc^NQ+W6G&LIhjwWnk zpgmYz5-rRy12hmjxf0v13zx0r9hh5UtU3zs46L$q)(}H z$X)A63Vi)9mCZxOt`B&ys&KlT1Gsjg57W@mjNF&qHh(`6_O2 zLLi;Vl}1(?F4#Mzt)q{*b4&gFozP9pHNwWWy_UyTD)bv<~n$Jgpskucu7`&sJyU_=Sdp zymzV`qBkH-%R3yvZz}f*mDMW}E?_U^%DDfF-Vp~2q;}?Dx$?Xs2aBZdF#z3XuC3?b28>Y2CLD9 zLZz8$4MUhfrrWy|bvyFIVRwrBaF6+TU8OwUZM=Gc)ZW=EWpzb=izd>^HCmra1+x(u-(^kp0jV{;v8kvPa;Wi| zOS$L<-oew_!EK(_0iNb*UEt}S)(zg#(|W+WdD>j?-*h)@LgmuO#&PkK5=Fqd;EE2U z(0UAeTK9Ox6Fsd9Jjv5Kz*9V}9lV35O$p5gy24RxYd+EYUcA|m%D5*Ik z{Mid$lIf&R|4OC-e7BOOOSsPedHU>k{0rO(w@y}DkrSN2Q7$AD230I7ll>Urje2XJVx4PHuyY`Zl{c*qq3u(YWINvw z&hlk}|DvS*M`>0&o$gdq=i9#S`T{dCk@Iy=(}5heFTe z37)_S%}G!KE;1#`7u?*h7D2eel-Li%tWMf$fiN`J5Zo|Q;aX^<+Regy*;+Zz^+Fx! z57>Y&10LuH+#N2=|6q8+y^q>}_W~JI8Su2)6H-@OOt{B@OBr|2X=T1lIO0h7X_Ige zh!nzRgZQzPu056sWo*7~Y=(h{`;I!JUg^vmHr%_&I@%AUGh(%AH8I_?eo7H%)GKpE zLiuRuGuF^BFxSwXj!Ug+L$?P-${Ommh86;I4Q+8;);4Wub5JB~=z5)^x7bu22L47# z=M>M3#&}#jV_Tlh^@P?Q_ksY4>+YnRyuOog&2-I*-{{x&0dWe&+63D{EVw76g*w0 zrTqM}^AWC`&dRtBWfQF}(}?`O z=7{_XNcwYHv_KZ-etW6yho6zp;8h>#=yb2B%A+iI&Xoe>Vtf0Z>G%~^qd3!4tGW5t ztQy6c)$+T>PLDygOqYJ92O?9MMTRhuvJsQO7X(bG%nD>}>r6twxjJa6ULD+3-USY1 z3e$*s_1F8R1K~yiDF{NJEtaMwmRl!Yy6C9B=l~J?b{WK+Ll3)`{knBXMZHlvPAYV( zdAdO$PH?|sFJ!r`+PPB{RW_JUTLi?zTrdhZwa;R&mTmqN-)lHGpZ(YpZQ|9W?IN#c zJ)!NwLfUrWy@Iw^s6V^P{MrzZWZwP2OWv78o+F{;FT7(598g?`viKND@qz2qvB`@y zvWTt9kG9GC@ppZrvo1%r^~c^QLM9>SL>h~(sf4*p_RA4jihqOmFqz4&n3!^R#sNzl z#JR>g>qN~vCnr-#+}dVoj*XCWe6zt+N>vffFW0498m7ISC&Xr*r8Qi~b-vZosx3Ah z=D(?;-A`dez9HSPXq$O|d?)Q{k!$x8~B({<#lv-;u; zqxzfOScx0fiJbYu_)G|!JYO`YHvq(gJrj9m&HUv-<}Vilk5^Jl`K0^g0Tq7Yd97C8 z^K0`#3xI!6k0L*N?-nolwRtwta!Znn=EqOkHpC?jifN{ zO$`dL2--(m%*~#{dX&c_9a>y3bPGZ2)PB8+dCnNPY=x`Kx}DJ4N43>!OIl4;pHqZ< z5+MD#vanNbGHGDn)aZ`V?rw#k?x+;f;h5jwqLk4p{h1URVR7r9d`5-d=Ah*Cj_4%0 zACES%+=K|dX0-32T6gA?i%&UI3GSq(61mKv&}iY!$&cKm!+$B3Kj54-FU~o?6bL(+ zrrlu}2$R_?gWvYB5(MI61&6|T{l;;HjqIOVTv-mBre3+_WV)76H4NIoe%j50C2BF5#Qi+GthG~!-?`83xWMjj@ zOzWEQ^ED(&P9hOj>jC=ENC{`H>Sev0C%FrAj-&X7F<0-l{a& z=o)1`SW762^|;fa`s^0j4~q@SY$g=mjdRIQ>aACogX@tj5s1fdN1R8vz&D6B0GZPT zqpZ16`7E}4hWU9yJj%rry9rNtp(?SQmS#%%M2W_krzhvyI4=XTkJpN)t|gR4W@@=- zCG3Ny{@pF&lu(NdS!&rLk6Mny%7$9u4F8UXJc5=y@&~ffy|H-bXS;6Q*NXRsf)_2; z$*+y1KQ@SH3oLF90C`F`&{S%6jEc?(gxgB)YhU6V(;py&I}cQw>t;-?6l-AghacLA ziHK-yqJ3xU718>(U9s>CUsFA_-otDN=-0P(?4^H2dwZ=s@@Rc)u&{~HP>Kt+{FGLI z<1(C~oFd{xO?m={i!ay&=>3vHzmL$1L%|6ayqI{r&i`{Q_3Z~WRo9pLwQ zT08jto;C&iOQod(hW3X>kJg?^gaGcKuSQA20EDGGUO1R=b(1zAb%C^5@O~97!c)u^ z2*d15HdmgP9vt+2hemrr#r0rbOvx_U2*&J(VGNd-X6C732Z|ueN#^=G+_wOtZ zB;@0*Y7Uo~Su6!^P*V8H4)h=E{heet^4f{3+-8~PFbTI_W;WCZe3O#2mRqiAs7biR z)RH2yg|RAM#2ZP5zN^E#qbYn4IH;t#@mOjQh)1*GtfATJnBlD@l*SFRb& zUv00^%))UznvGAvs=wc}Gb)ot(}+5n`Lxtvt-4A+XYV?W{aj=Avjq4)CAqWPl8)(_ zbg19(*433iVhJ4+5+jiNt8)7$W?g%lbqxTQd+VYW*2OKXOc}d$nxJtCN#%z+091w92YV^*@g86qn+L1M(O3_6Y^X-@I+r zMUE%D@L0k#@=3}wqBl6598Y*LUp~1lJR@NfhXYWtAHs6v(~v&9N*7qT5}y znkbf;^2=R1qtGSAoZ43f#X|Mppoa2kv!R7R>_ps@^L?wje01g31QT-@h?(SS(K&9> z6N-q3qX@Th2IPF-s$7w<2ftLwPc&Kjfix%$x!hn?PSM<=L5i$xDvL`5R^^I>vY^e6 zn>H5%KdGdta`;O&w=@<(yeONVc=ug3WT^rAF!p;}B5lyCC6&`quLl_9mg!DqGoWX#v5)|<5UvD)@1wKE?$ z&rGf=&McJ%KDYwm7fip41J{sBQ{?qhexWJ_=zx~vMHq#yq-{a zvCYh3AaiV1G&5I-I={Sw918Xm5id?*Kb3NYDa3r)Kc06MF>KOnL)2l8N!@Ucg(1O& z4CfQs=mb@s>^MF+!o^h6=prCtM?N_F;7HN$@#3`^6?r@eq^`8_@JJ{K_0G07mjKcJ z=rg8f-VhyW9p`g&pfk@dgMw#|k}#=LlZ+u>2mM-|P<&GO3rzeWAmX=Rgt7co+MMga z1_|{pw=!YqECwMRm?uT@bzEl}>VzF&vL9%UbqF}9q_@TyeHO^WJ+H>yt$4MXEd%7o zf#X}vorm_gUhQp*f8BOZ6%%pg5Crh$)~R72{zsM>q4-T*(q>RO|*af2;@mjE9!4fg&~;Y3?m^fFg*hO#*r@}>yWS>kS3>LrWo^Om^ViCg}no;PMbl|5=|z)1iU!u^N`!qx`u$Cn%Yesv>71FYmH+7gw~jRF76WtArM1?UOD7$0 zX0kR{Boyyws?>)~xr0Dtm{D2dGSW5q%`NVI(|R=oM815rP<>2zDf5H~xMp*c&8^F{ ziI$W){n5jNx9GU z$syhBbA3~e-Y4M(-s^-hwx!)_;K}$tW#c;l{H!W=cI2tnm^M}XdP3o!*?{)~@nJKi zKW(r1edoGLb-p|WlxO22i9E7SD8R7ooi&*AV1?Bv&PX0wSk23--47b4_6O8_go{jv zy!&*GuL*4<;6iPj@P%XG5_rML;_KCOckHYOrK(?%7i2|+PJd-)x{HnJAQ01;8=H=% z@^R>Ee714~OD0_cUM~RQJ zh0Qn?t+ZT^{6X8wZ+6y-8xNdBR5f)aHPJ*8PCBOb+syoXftYj)aX@~}SnK2bwUYDY z*nb#2Y6*q0dO7O{B&(TOk&F80L}AZ@#~2_S z21wtJ3YR*r3oXeS3(DH&0uyvOkjXcCpz;%y;6oizH4_!n((776S)7|ZGXm1nd2z<> z{MA1jRSV_v51%LW?wSWoK#&-b)$@ClyQ1wP5sI>68Ow07_dJZ%d23QwEs z2SAa^zOVk3tqtJ0=VV3XkpU2n*=8A6FI4_g7f6#*x2#2YN@53uVYXSumFE?0mNCjO zkQfQ1w&T^8aOHVLn`Jkt20m??SO%P6npgx}s-&*i)YHu}{{>@8B3SF&YYpf9l83Z`g3>)^i!lrNA#K$yZ{9&zAWI4|K@_fA%xvq`ckR)cp!~;8fPP@F zDqkL3ixP8lIz6M2KCjo#)f38IY6I2}^oos~C-V=*$oH0jzc5|*15wE2imXvj-`&f; zmo?f4T&<*?!+GUC+{4Ysd_5r6m7Pz>O^ftoRo>WY31yi|+4+QgozVE=->pFXkC^%g zfEcDbZRm`6i|l~nK9~$ME$%G>60Y4x7K`2|r^QpP^Swa4$LIrIODH>4CD1zJOH{_l zNNNdXJ5B0dAiC_&#>+dbSnsk-uHH1YGxe9v%2i(@OCh&G1#iYl+Guonk&|#s@wAQ6 z%2^wsS3%1!F)c3#qPYUo^lC+BEhPO^waWXqQHP|E3YsevN_37+s8`s;S`0kHjIXy} zA#+XActr8@IC?Tp5j0$ov#--;zhKSx18J+3oIUJ?%h~D1rN(*~hWb%8(NY2DxtdRh=xH6`NuJgYZuhh);Ilm~%GuG=t=b34yMga`c_y0V-9UOWp|Wa4!o_4|pC$5K z?V?m+2t@6J*5&{ZhFK!dmFE@3B6uORB=SINXNf#lo>!E}_ozI_n_PpyWlGw$ zvU-iZhbUhL(!7w{G%e}UkF>_`jafhNaV2H1^hsz_F3>ls=?E9#^-4;A0JE*9Gl6iE zFAID`NfLo10Ey?x*r&hs$~~+~%7~L{EW%L6OzIR((4eB~omvli5gEH|ajPn7AOt-W606H3a`cgf+j8R%$LTnX@frridv2$cYdTfnAL$OV%cD7lV<&512uR!V_KsMi8M}MCnOhfIttCLja4$l; zCm384mRv5NP8~@*(tIUv$5OHF$&bay`EYdmTD$!~MCwxKq^1&SwPwP<&X^1V5!UH6 zFFbKpc2a?aR1rS!=$z#8^QmrmM+w~C356vaYP-BGuLpf}?7nkSpS@wjxCCCP?v%)d zssN#99hGxv`nbILrlnqBpOPZOs3qLG(rPUNdfl!mu~$7L=_NT#xxiKI6?m@RI&!q( z4s193T1~1;Sgci6^IBn*I%T!3_4@6blp9c97LLpqr9`awI9^%#d*X7;d z4W8Bx{wGiC0QX*)ah1AV;66|5059;gcJQ#LO##2()4Iy!-KcVi%76nGWQ9f7K%|lU zcXh(WfU?i>U#^xYRTu)1qrktTwjY}q13(yN`7c+VSCs$43!x>%0;!$lzg&4331IhX2|`%QF9k#Nw_?K@QpmnO*Toe9@Znsf_+NEdaxW&&b;nbqYqQ%ksoW_Iz0 zsWQ6eLovUj)1SF7o&xC2wHL|YUEt<_ql_Lif3gq=qf$2?3Q^?dZ`PUeZJRNJz%RbS z+$QjDBMky~ex;QPl>qNvt2F?GVde|D^1LEn81w2Y;?fIgXZkqUF$lO4_f**R^Tk9f(OhOtx*BV_RNj*HF zUSN0AABNUd9MntoZZ*_)#Mb0v|C_l)=OMZC0cY2*WIk;L7ugX3p!B$2G>Q7f9`v ze)aT?TAxY;OU;$4sQ3f4)6?5>jLlWY2DymJgo;j%hTq9D-$!Kyma)n zaa@d3qT3)g>}fsY6;JfEZtx^e>jF>lv<`69)7ru9o;C&iL#1T`Y7fFc`zS$-9Y{TA z2!oLY!(cC~H~`F794M_g$tv~%nXnToE7v7lF@?7 zmt+i|s5p-DwbGRRJa;jY;oHZhck0Q9wA(vRptV;3JB)M@5FOMiE6x-KkM4O;eZ>j^ z^%dvIzbn=_7@wF!E#EX9oCW-@klr{o(=2NwX*!C<)#YI$A_I;cIm z%R%xf58qP5-Fi*F&7~?j!t`+=5PcjN=%eQKk@EMKj-mG1{-B?GyfT2(wYSsdBlf9? z*^nmCKX2N21@LLrMlHErwb5_dxB$2{+K7`}v~izlpT-KWa8VF0}5R52U-zCPUo4y;R1NOxCl3A5+padEp}MUQOmxX9Ah7jH{eIq|zXQ zkj$DCbStxCtevxfHz;X(WmVSB=G0Fl(C_e7fVBPE2GQ1O^~{+(+IdiF>}xaX4Joyu zg<8H}4V7#4M|VA_vq{ZIcRQ%FCjO>YOODpgFR~#y3y40tD=W@%4#|1c`lEYgay{C0 zP$RW2%*xbunCaj=;88}p2>3?RWP|7l^bc8;mjcn`a`|pdI>=9xo|64lJ;#}vUJ67_ zyHpBvQmT?OeP@7lW?bc!kE>sJjx~24kmlNhQHebvq45!$`{x7C(bi{`JNbHYu?lgc z{vB62ANX}8i4e}()6muK%p>8>lfFb_aEmm8n7=kL&ogLBx`2p4iAZ zDQ>oQ$Uj-Qw9C5h5yK;;E!l{IYcy136;IeuoejizXO;J^o?NM7f84}>DG>2xq2}ea z0l?_xu8A8PJQ`kM%0C;p+DI=2BJt7N;5(8Fv?rLCm=%y7Rs9^X{-A!jhe0JqvpIiu zRpFlccYNjQE-)&Q5nS!Y`xS1yy-UtwKs18*+EYv)=K;?!(%C>%RBNW9n&a1Cd*X(#svmdAtg<*n~O@$aEJs3A|8C?bHxZADtooh+A}JRzs17uvt%jqT>F^ z#6Am%3m8{9518wTkB_B2>9?M|3W#ix*tM~UT{E$NXJTIjERr$yT37{28dtf9L50D% z%B#ZY{*d;_*XsM{iCLi=^sj6!jb3XYuElE8DzgecKq(U|8}A%RxH`-_-b*s)7nZ%o zL;-X5VVh`uKzcj5^6E8{+?T<_y2ycm<12HcGG|6gI4fkswaQ)jN7y;JL)GCv*D{Wa zJI(W4Iv0GGr}cop>}lQLuXtJ)_#RK|0Ds-n+QIjF+7$3ps@GING#LJ^D?xTnfYfWg zb8>=J902Akj%nuv2I#RXDEPAe zm8T!T? z@u{$uCGN}4{7S9$BU4$wFP|ZrKf#0^K2=L^vRcDotvi+Q4gD)xov5XEw_4HHwlGB6 z6x;lxG9cZYAqy9OZ1RF}opbj|CM!n_KpI2D)AiO2sWf6IGP7#R+5TV&517o$v4lfR zX8katRjMHK53JU*sahJ#E;x!%S8X0`T3vFU)>>n2>CfZ%w$RJt*4DtGTKZ(G6^$VM zL51>VA!?x>d6UGqk|E5w(&(uB(D`ztZ`{+N5DHMoDv`rrE-?f0=ZS$nTh_zh3`l|nCh?>g(iFWZ=~Fwn>S-O|sh-vap5|%YU>;NnzaH?ezT8~! z%e7~ci99%ti}RG|9x{Q?_p~1Hg`U<8ex;{%fnVim9pIIo)(&3dX;Z*=Ju8zs6;L}6 z{W)DJk}3hI*F06CvFSWlfNHG#ipqetw^c_%+L>H!}#uds}*v76OUC0hXAVx(oCQTQiw6idVAD#~-R@m?4=H%N0Z6rq5gcXT50 z&rw%~;C;3=H^2@FPs(JR*@JzzFZCAf3e8Fq1)OEQ8`w|bA)Yi}p?6iRrc4z?wl-^S z0dmea(o!JFpZr2wW2&X6EVw`Hs{&u9q&G`{@R+I_{b zn37QF*;ao6kWrc>>9$CpaDBNix(q<5R*hJkk|X`1Y%GJ|HfCy>8kH5LOI z1@}U)6M^dkO>NQg@+Q^I!=|GJ=xCw|zGydvml|n^zP!ncL0_1MvKB$u=b8iyv?2TR zpUTr4Sl{n8x<96WTgb&^>)-@sNqkEa;Fx=V%stA#j#O61>fdbVjjIE#%eM3OH|t;T z;VSg2P59ooNB!xYtI5g|{VQ+JUa0VGp7b7tH+z!lO~DB&jF+Hq7i|tnM15?}A&HPs zF3k#wmT6WuKHK zqdct(JkQfQz{h%8JNP(HV@YA7h4Q9N%1Dwq1F2S=ImZi)N?T>JtMX~h`tjq+XU(U8P6V6NVlsNNe?EAKV!ECzniNDF|EDXA(C469%5 z?sT8sgm&Fz^t*h#4#G_RD~=Snr;!!|hm=&6r#z0S9R5w9oo&UJ0bix0Jtau^)NI96 zLQMJ#kF|timuc}s3k%oX?@u=2LT!vsHd}zG^$2;qN!u${fHKAfH!|^x9#i~QmHU58 z@5_KUnr@e#`hS^w^Ekb#BLDw^KnPERv=~AY9v+(~5gHL_HVGOwabXa#pQoSh=`CRq z755HVCP{ZXamN7_Ms(0oFYY*_18#`h*9flTps1**i1CX!xTCnBfd1;67hej3b?LJR!_a(F83gEG3!ztk9N?KJ}b!Wx) zd(-bP*Yl*Q=j9L8SDk8i(w9^8PKiJ*{dEm_+%WayM%PX}d6>NJxFGqJ7Ja03;}q~R zBaH%Ir=%k*(|zQxv*N_9G(Ob%wucwQshb9|mHwmYlp}9yeZQU%!#nZ2E=9XA*f8x(u9jTam%@ zQ5!rHKn790vZ~)2p1#qb!(om52vzzcCGb7VI${_|N4%&~XuF=@USBV~QQQf6i*{k4 z4VZ1mfeg6)X6m%|`B3OGa>IGNpYqB__8*FZ*9i7pp!VEX z)NBpE<0_#<{SMsbQA8=%N;v%0U!72 zzYf0ikTjnaY-(F*#u)+9NwTSCBQAls%=pKEbVtV~97HTFH!aU9wJCY7Y>NVKQB$Qq zm6^V4$n}rSgcHC$)!)SYgJ!~Q9{v&-JW(5Gh9?=8l7X~1Em^$EEbt_=z&MZuR2pd+ zZUPYtNU~oR%P+IWj00~|QeS12G=X4|evyS9gyT^*c*lS^fe3%ig|7*O;lNEgIn!S; zpcpJP-8ZAv^Bi zg60)$D4+^UNOS@sJ+E@fY{JErX69%k2UQES&txO#-c1Qt|6+ne-EEcqm~NLq7wbaV z=Kx|MSz6u`EfKrrie9ukT^Ha_3KrtvCp)bde74j2z~?xvAN&lb4S>&e+90^)v}NEo z^yC&u&(kVgT&2WxhXVXYrwxMt*=YmdH#@B#{4Y-H1Ha8_z2LVyO}*E<2jh)vBV?`w zB38UZf#9?Wwt=Bwyh9NSHWA#Y=dbfBb88YVLT&Nc9@;LnYP5g|iep_f=Pk|=auh9L z3>e6LAd>r#mUF9>HwnDgNMpc1D@pdn3scwXv4__am>zOwPw<00H)DqB7&VogLpigr z1~OiFu%ryS>s0KM`d20f;OCUIU&ogDDN7S>++s50z;C#W&8b<@+_=vfY(bwfa06eK z@45i7|8YT%>&uSp7lDcr+lH*$qR2|${KERC4aDrStnkUir`1!I%ID6~)iQioUijy1 z<|^Qa?*MIj2fwUNbp|s1@EvF7o%*=KuNY|*h+*qN4q1K2qI!7Dks1QNd#n~d|784@ zwqy(51in97k;A}eX!ww+1V~gmIOrnz?uYkMP5cHX`g2LZ?3rzsQ1>|ftaco|ATxUL zDkJJA$(MXd9IP!8ItYVzFa~RZ1O^{JQ;Z+XE7Q8|Uzp7?T*sUbk-#sf-#}vbA)$f9 zQ}UcPb9gyqOkl&F+Z!Jy9T>W3d|+P2iPQ>sk6OMo?T6tEbD2>f7F$*xoq|CW4vO?w zvC>h8p$R?`pMhW0^2EFrbP|XUS!Kq6*z2eu1uGZ=zT=n%sPa(qEwxL!552l_?9!V2 zHW@U$RMx^}F+~KVeIf%d?kF;4am8fd#l9Ufp&7G^<>g?uBW)PBfmlX@Nk=#cLdBEh z#lI-35<*WkW4D3SOnTm16V|MBx~gf<6Y0o?Zeb@Xe7Y-+%hH7buu@fKOB^n!QNa=iRSX81mw-rTOB^m-RkXxGm9q>H zr)gEeVuslCDjQKvAX0l(X4cP_?`=hPxJG5(sejYsRPei<)(d{G)B3>II;|i4ey0t9 z|J`YW;LG*V#dHknm#zAY#R9 z5ClJAf^A?Z7_UJPq!{rs;Jfz8Q;>O;b?Xu?LT&LH1Z{AOLjps=R^$x#YQ6tr^`8Qs zpw$Rx-!;KvAc0}IGu8;yM^%c(&W=RI^icTH9?DO)uEo? z*kg_RLNR|M{WXZ-ENP82+!ixg(sr-bY^fSY4oQKu|IA=(+AWt=#iz||N#dES^W{~D z#?fLeca2$Q9QeOynVKg&v1RVlnzhU_Bf$Sg%fzY9-8#k|WtJHMVl>&Cuv~SGryKb* zd*4yHUz&UyNRwp0!1A56xF|lbAu=X9v3=)5Gn(2 z4kAddgXqxIx*Z$p*r@@LAd08SE(>wverxdru&NFq&l*^!*5%&`JcpXIOaO5f5x4!6 zu0UIA|6Z%j6p)Y-9<7GNF?w*PF3t;f8|OLKHKWC5{T`>w0lj>!b^fde`cb? zK-{p{pn1vg{LREy05PbTLnmF|0H7s69s5I_CBUo~NX}W$mnIc93v_Z~?R?TmUim(w&kg z0uQvIG71cO)@IzOXUY07wjT%E)(bwwY4MUl>vXgJ6;}WvR-KUMIjR@F)1pOqx>vS{v3xWAj0DSSo2AmRSfB0eA13HKkbeEZ0A`qjC< zx@_6VP8L*}_2}Sri6Dx*z;&ty&yih6ASRJ@h0TwtpkIZvW%H2*8+G4R<4|eYC;6}z zi1vavYmvgl3uJpw-nTezX#xeKmLyC$GfY@Ed?O+V!#Oid7_Nia&7U*BN89iT{VVYW zNV7_^g2JqZEB)9p=}ce=ePGwr?G+S>$fzrD4>_AXL2*jjv!5^k^(Mu0&H z=7wF47tJNVRlj36$O0Njp=J3^_o>GoTBAd(X5&CqmClm1>H{V_38YmWi`MS4KdsHM zo|TlsxfiRzt4**CM1e%`yY%kwjB5yp`huX2qJLDW1@h3- zhV;xPfpVkX=?`Ye^j8XOVKS1Bor z6I{@!f;fSy3ry7r5b1gHiT;EO_lxL-WmGv!fuBULVIjrXmB|5!A$!u#C@;Bw-uxx< zdqHKkI87T+6lYG?aehWH-VHy};z#f9isv~kiVNuad(|az0f<;}TtM(CCfEjsf^l3x z@HHmb1crifTtM(P6C4AEf@6_QU!nrvHNhbug3HsN{AM%vzTMhO#^&3|l{-u9k<-L|ACp zqdQr(`hh^V174(Mtg+(9fpnAP9%hdaH*26(2D((w>`XSZOj5_ItG6?dm4dmMjQ z(yjB5R3}!EFUEASceiawtJ2cH=>i?xc3LlZ)MT{dc^K~v+6W1GK*Wke z9)d41!8R}yj6)uR6eCUrL{MI(ymZt2)8l>jShm$ID~}~^iJo_j<;Du+u8QP-s*U@r zHF5}e!~VG+9xTgQ^VRNsewhA4nZ>%m2aVJOzEXc=LB51)-_HmZ`WxgM1qU9IZVt@a zlMLZTUeDKWmxoIJk1DxU|B88mhb+viyq|0{@EBCKsN=?RWsqvFRQP@)wSc(p(#o8@ z-sN?hvr~(_K5*lpPmHBp&77o&Jf5|2zj~uvS@+O?K>Ou5Hzx3AC7o26-R2#%)t^;Q zpH(X9x-1Js0Uaia{Efmj-HM9#f#k`sG{Z%~x3xy%q1$G;_=t7W#4QT{Xrva9-l$jR z?AiIW{+<2UNZ`9%drgYEdJ`9nu7ad<53L$il{p$XW3^cU#83OT>!<7FF^zAjusc>0 zNMMsi2oM)JtiVM&yh<81zu+ea{-oZpmwCeokj|7Z=$3m!0vBx;?(#0TeqCo4ngn8@ zC6)4_Do!vzeJn5eipqb-^o#&8mW7crI((pe*p79w2y;FWIh`pQbM`>voSo~bV!O^2cZX_RVvBkC zN+8C6LM7;`&?@054ErQ~ic-E;kOo;s3OSD)7njulRtb*x&T?_C*}4TJUS@n{%6_2k zyg(lBUz=@PK*6<^hph?|gs@fNbdt9!e>gQk3pVP|w(~YpZM61{+S&z@m*=&H@>adG zq$@`V;*ZrYavl-taF@W9T&UZUMD2wZE5?At;{z+R{Y9fb3fRI}7#=Lf-eul52E-;k z6(2QGK%iO&PU%MBhCWUa1KTYm;DU zg!Ls|0$!-bnOe6*0u#KCyf|k;; zS;AUY8q7u8fGBubu+{~?+G)Mu*Ep>Ye3{ew!IwL20Q_2~4T7(7+A{E84$501n*g`( z&cy>tOg90*4?1lS{8y(9fGdl0g(BN;*lB&cE8fFtz2H5a7HtAxyqmQVvi<`iR=f!i z3$}{{<4u5Au-Pprn*jIB7HtB=vaN1eaid#jyWJ?38!M3eeI&PFQLgE!`d6$2{IQbe zS1ytHvXO9IKQI@OJvHD3N;;~t!4~(cB~IvGW%VPEtFNk5@7lZGxbpVd`I2g7>w^Tb z@2mKDx%dX#6=RIhBd*{AxprS;8HP9Dp$ z>@b0EKXqPNY69<2(#e(0vf-KwrH$Tf)6-^)ntA0mFN9C5A)j4LP=V`Qa?QNB(Dl+13LH#JD7d2~1ilyVnx3XT{&e%EHt=mq zs#i8xhP_(SSiGq!?;fNdHiPfO%75;5_=`1d@T76|R!^w(B?k0<)v7oN{H2oilC?@2 zv=Rt=svo8wBVARgrC~FDzy&gqv%ffE1`=@Mm**5qltj`-@hGtRoS{y5j`?RBIHe@{ z6$M+crxusp)P#Gu_Yqw@F0tA2WHlxtAF&dLfnQXT{1AF>ObEB=jm3pSC5xg7JZ&2; zZ6L#Cf7uN`Wofa)lf@`chs$!0K`|J_V;>MTkL&VUdKhqHryo(bd5(G15D;g6bfv^8 z(>F*$um3mI@yzWBJRG-2@saAvlJEm@MtRv~O#9|p)}KuvT`k^WUXa#)C%l86mt_F( z7g|7ZysRbMe~URl6Nm$J#LLSUKAd=23*EAOim$lG!;;H&)+TGp- z?SECvkPb_3)SX`9aEq-kCx8=5YE?Ga_QdMt9YMD6#s*(LuMYOT@?kEYz)Dk2bl<9F zJpaG5j16;aXsniu${yZH3r;uPDD(ST_RA_8Y-3|}u;rPiiiHhKgI%NW&UTw#R;{#7 z43=NpV3`EsqfhJ3VmpFwqkQair@JV`HAS)Sf~M)Q?UrT@^~=q+$C~%$=JQE)^E|rS zw^pi09%{Zd0;K;(DV#m3BL6L9&ie?1p&C|*R%Lg*mkj@c>hw3mp%erR_NcZ&1Z$yRe9dv>mVM^7a zlvpG>21GEbRHA!;yg&^(t$$@A1=3X66ZrD%#ai7LT6Aau3GKqSHQEE1P`wO9iT}Vr z|JGTePoV6^NZFrto8?5S>`LI9j5G!$pOrINAVn@JPE?b5+Pa0-$~N#MCGFQ00~2mA z-eijvh|wfBv`FbAE{k9ZJU_4^n?U@aCs;~FT`o6mEgx+`cMlga1w&+^8ccfa##t_o zHY>J)So6S=g-ZehDVcZ>@K#kPvV}|T1cp1kTp+oG)Nk7?7YAAxp90dQ$M52zI$e4u z`>N3ocH;vdQ`FxQq7rTlnoJu=UrL`?e_IEyc77m9sPON@K(}Q%nUlQa4!qk`i~{kI z;^jw{&P6UGyk)6h6igcgadU+bgLh4{Dz< zYGkAX15dVnPV?j|%)TSQ4;pC-$Vxli5>B7);QBMlTGf?z`UP8P3vBWn2GVnfcl4Z( zua3>q)Itc5i;7^-r$r-0&CxxTvK8}X>+Mk>vs(I72Wjs_p7JprX6&nrX@U2ex^dvg zwIk+95|VI14;LKqp`DFLd59H=^t{UI*#cF=-Hk-mw=EK%*KNRpCkT+DO>)Ks#56MM z?~f+@Zn>fZtX@5z**`d^0WWk~FL;sD`oMio>jxj?v;pv9rwxLaI&B&F?T^mwCI?ve z@6JV{#Pk3Qe2vov!S8h10QlWb>j%HrX?@^poz@F}ztf@vEQ~j-jga&Vh*q z5{wV9V!>v&pp23)7am~6vaN1eaicg1jpfD)(fKdk3rS#9-4MGV3X|QGI@`Ud-=b zB;NGaaMyUv0rf_)gdbmQ3eLM4)f;XMRIm+9ZSPrXrGrJi;FSKg;xct~!n zz3Uil1jsOwfCj{EUt8H|dGSU|cQS(oH!RXOs;OauJ9ZG386ddfx;DD>#(+I*j|=3D z$gA%EU#xC1qkknL0xwt6{K|Tn3L6R6H#sX1r;(WdS+&wP^{+%>;9W|ZFYlVAKPATX zL1xhNfLO2K-8HK59jnF^(5o?q?xRfiN}%f=cRS?hJ*snG8yBO%yNomiq`0qCibqA6 zr}eD;Vu>f0xu&>&v1b+++;~{NpKeC}R=en#X0{bTLc4efkjVbrihFk8foVJ4|AHIo zP!4^3r(AinRF4Ab!qpYmT7BA?_0npDr3FJo>Je0Mr>fCNx}64x+`~Mi4a9jasI0bk zj5hUK*j#O^(M`emZDaMVb^^TVnjmJb_6&Vfc(7ZQk)BW#PAR7Xi~+1w@Pg1*ohT|c zn8twzT5~3WgGyRiNe`^`Nx4nIVPN%RXV$O0W_Et{g-6z9nwc;0RL&w{+~RF1k*`(f zni6R#=Tt3kMP;>br0<|S+rQov7FR5;#Ze5V>ntwVw=Za(7x$n~hhc34aV_ph9b>Z= zA%}q%*svP~epN{)RyNv-F{_7|H#M_7KHJ!6YaQp&!Vq7h$(N|H9nnaQ?SVRvszDrA zI-^9*#`D=f$o9b-8_QL852O3k72j^II02+%B&oV~_F^^LOU!(uKx!v^*UWb7KT-7t z%5I$fuqp{8ua6|Zq%}i>3@zXlR@rf2p#S>W<5d4!tg_=kie6j^y3e+2YSpjE9uGVZ znD{U-sPVO>HU5d#Tt+_dFG{M)k-N<5J$wG3oh0pG3zUzPzt%(}L+x^T=@Pd>H2x^A&%xz(X(ll(YZ;hmCUn$@l| ziZzmxwFl@CNlbtrx6T;@e#%HqV9;OjhVr+xQyyog7y)7u*-!}sYXW_%nkv8F^Vx6a zfj5Evc{Ak@5L0%Gtk7CtVYMFv(y)ExeI$!J2~?s(emAW{`Xhu;*K6pJ&IDqNzD!*z z&=okMNtTrjo+ldeAax?{jkD``>j1f6jITP_Oxv632*IPg(Aa|*vb0hT~~tj)CJz|)j; zKxN}XW-;l!v=7r~Nw|HENv;I0RMP&Hjr$;(hRW2m++!k^aBn;tYjEeh@Gv}t*K$%% zbaUSB>FqrlLI%xKhk*EhU!^1)vk`)y%D1?H_?3*VLcfZ9M;HrzC+YT&4#vPg5`197 z`m_lQe86%Z^MR*Y&$NM9RD8g!o7?{=)O*8G`X4)1ID~k1OxD=VzHYXy} zl2?7rvXl`Z+Y(tO$Hi~VibKG_ip7hgA}a=~>>!90Sux-YB2{vnT5q{oaSV8dlG4+I zH1czOjc8^3gdHgSFu0=LKrp*D0%qn3{;1P>!8bUq4}7E3`oW)Y z+5q^IP8$S&-f7FgkA6(v5;+yPdL9@3N=#1$z=t|*5WK``1K`Ivtsi{2)B3cyK*Wkq1!BQ=kzjl(5DPZD1?5!W+QL(TShm$ITevWd<;Du+J{q~- ziT!yuzEc0nBG2HV`K^<}8Gm!IA(H--%WB)1NzbqS*}(Lnt^HKN`bMrubpN};pBiZ# zc;u3ttK;nwDWUURyph27WaXEE2Aon7ag*zdmr{Xo;J+&Atl)7JKOJvWCl>?{tyaH& zggn1*`QOR%XjgEtY-uA+?a+u%ie}rh_e0oRvt>R;JP z0RBly(r3jT6C`ilU77xLPJ)8v+IMm)4}61?4i1vI%|TwDwk3h-dXsMgKdz(`gJsg@ zesh{&ZLv9+QDyH)K2R$5MSPLE&Kq`JjqjiCM7f@+hK&sJtj$68RBKeT&!tkirC!NL zu$>T=={Z5vRzJ_$2?5WNJ1XfZUQs2f-0GrAN_N00T~Ns&amhL)sN{|Xf=UJ%dXR^1 z4zf!u`5~>`0vqOSV9g_i#2kO~EO?|);zlij@1>?<6!>-}?NwP@$@~_=kMxE-k7K!h z#=wob#gZ0~k$-j=ODxOE?B($ycx1y%@W?~+(MdEB-4+=9{fAt4(T(6y56hj=oktJ< ze^P_SM*S-XaKOur)B=7+NivLWyKZx^U01!~$a=7p*}T)EOk5|$may;pext+4K=1*41MFQK1 zveyFU>J2^hPHwo!Y@~@my7SoJxtyNsZ_T&cf*!U$%jOGdM4WIkyS~^=Gzny24_AV1 zlFh*wu72^jy1YwSG6YM68ahnfiIXc!EsZ)R6MiPiQ?|+x&jB(-`m} zYwZM(W!BQ5wP`ut%uKf^PKONK*eHDKE|Z#NlI^*CYxwGOrle@lF-7cY23lcI8z76A zEwcpXerwe*kfmA1*WCfkPG9QJ@5ng{kcmU&?w#Rc-1M&i2Kw)v>DEvES#rwL3P6nX zgo?k%lg$8jMwzaPx?lb97e&(9q^!6{x^1qQ<>COVdm9+k{fcNoN8N8V+l(1>{g;~U zk2d||z(D_{k$x5*TTTB6aMHTF31nP^MwQ(~7!~pVGvhCE%!={kmYxQmc z84>ba^d7iu0`V5-2a;pSi;l)0q-W8JPWXyat*AfSYMQlXq9NdSm9#kA?d?pF5_ks9 zoNXZHlwEJzM-Qi*1crZgSs+W3V@hPpRyGNO%y*)|_U6OF!)zj48YKu42|E<*#8i}Q zRqwD=uhIhI4&o)Y;T(7gb4GdwtPX%fbiAhk@iz045n$jYwjv1f^&&5^<$W-lL|)Rb zu5h7wNehSvNM=&JiceSSFr8>!-2&nT9mfLUO3?g-97uLMfpmBHxKS`<%a-ZI4q4_@ z*>XAZEGcqVR?EBQhIx_QzSvRZ|45RPyi2|J8y4f5Kq7kd_6IlKW&YR(eo;x{zkXx_ zkrYTa=YjaIOzTBau6z+1d3Kl>cotvttRist+}f3{e@CjXFE^hb0zO?ywe9UTCUCvj z6f}X12N^V_>rxvuvo>gkfcU)(8b1XJcV{AZ70zIbB-pcxB3>tFun1O}N<{JagN z!CZ85GpGj>#{~xz;1itI3qILtec&fLtslJHX#?O>oHhu4veTAt11KH;oWkBCAdLaPprq{A4|F4Tm8D^gg!^AH(J3GuC?>f- zT7S{ByRGBfz?-eL6Tk(BQ?c`aUj4DJX!Y;37L5Sktkse_e0hco99RyZfz)+HWtC-i z)vqqD`<4GBO{3??KgjR++B(5`8r32B46$FYvVhy@x#{~wKeeW<-`|=%0;Hq&k_QB; ze_mQoARMKi#o%m-l8`rDk8N6Ip@;%Wk|ZS3a(y}L%ftJeCh8FC8vHzif&j7YX)vpPUK z)P~VY;PFP90%F&K$Bqa_511oP0C(34&zDlur@*+T_6JquGww|8evY29!r~2_VBmko z8aN5OQ%Un>Or;;4<9e~S>V4#2N%(Uv=L(^$_Bm{Vsl8%uf)N}b? zvUrw8u3F(VQ;~kwf*?}VWmmFQK)_9v+ z1sGW6_L(`g3Kb9+xivB|dBzG;)&vI1?w?`eZF?621O4$~0+nS3*-u89eB-Hl#!)&K zaf3-@KlyRo4hC)vsq;TFZN~f#7H*9w%VRQ@Iok+X7aY(BMZ-RB!)ge)V%IdmenF?0 zy-QP40obwh(!Aa-w%i^^393!M;$UJBnMf~Dqh=E$xBg9?_n?f${V&&+vBL5Z8#^r^ z9lIUrZr^;JMzZ%=L>mHrKuP&)_FR3)8G-LpSIibBToC?c6%3rz8DdfKOptJYqjhf! zh{2Dq%=yDY>w@QS=4_9DU9d%8OXv3Fde!#{{VVm{I>W_hyf7gBmGNtsR9b598jIHxeWF+xTdFlGm1 zV6~*%5K+vC}d$-iJTH&wQR51iZN?sD!lD;G$n}qR`BQyY;$Zj+c zd5Mu%M|*wUaz$Is_iCMfr+?Fz1i*iCS}*v|PU{0d;Iw}5gH9U&KjgGQ@E(uLt(EQ| zga7WhoF-e%m+ryE*-A_q!B2PEAov+h8vsAkY5m}))B3=}PU{7?owlI6V=>-w+6b9s zfru4vHOGSOBEfj8ITmbo3(8jWJu^kWeG$vHx@EJ}VaKf;E0Ftrlp?=Rt@2Z|&LnW= zsJxKuR|_spcQK$m_L%&R3{v1RN_s``#me+hN*_4(&$w+4CeKFoPMQS@J@76mK1A+gpr1Z;ivJ;XTC4u%`y?01ugY5_e zNA|G8c9*grTg>jCw+x@|$V)_&o|Mg_7peI^V`dxy9$93@{i~4~;k#P-B`gBnvg6&} zjAj37mTdyDW9F4tr@LNIK5dqr0@9`u>&d$ZsoNy5oowwKTc_|2Bej7vNj#{-X99mZ zsV2{;!}ls{`bywsO4`4&&bC+Nb?~e*+T+m&m>_dVgr0HUjK9I(G+&k=bxg zAiQ30?3dk;MY8N3&2PvrLU04um8GUgZYYivCiM~R+Q(b}OaNCa>4?fYdq6F1sb8(L ztV#DJS+0_nw+))=^vSbZ&2fZ&&JmnaDO+x8M)`dFK^HI zh#Y4|m;w^V9}x@@=>&`K7)zey2a;(Nq^Unrdo3`x9Rhw|Nhg)qt@^G<)l0@i&yVF3 zBnb+BYP#D%4A`4)n9i^M?h*BTXw+h^ zdE?GV-dH4gZK>qHnawAGK{c*5Wz%N!abQrht0Vp6>Wd#VpKJlYX{2G`nOckRGw9*0 zoWMYWDaQ#w#-Dt3z9`pBxPPm)v<)PK5`%A>;o@cLCDklyr4g%a%9VVj#NZ$y*^;pzla?`pg+Ch7nn)n~h)Wbjmt4x%@&v`Fh zF~bFUo74+PZ-u|`7LNFIks~R00^eEMtMWqxc7_!4m*gn95`@XP<>7K5-6P&ooOoOR zOj~EPfbUe23}#=I%W^W|2Kl1wr32|eS^QWs;$4~77anqL*_{WHU&}fd7<92MqKdk> zeE<2MwA23Cx_Aiq9JRZQx~pfnAX%1v2NFGn?{*8N7+11Xy!r}Q(D`0er3&c-QcIztIFg{=Fd10_G3VyEBdcn_gS|9iYPU{E1&}jqU z7ddSZyvAwEz&~4-TQ%D-=Hll{OgD_dzi`?h_*YIF0RP5m{ovm^tq**k(|WJd+akF? zsa3|0&%0BGHSk478UkLbBzZYkHjVU&rnxPCZYFz~P=j5iM)hTntS2UX0!57+ukc*` zyUTjdIjEi>{EHJ!FL3wALuvsJQIfo?VR=F|{ec~BoNY3bz?DX70$-{m`B592;r#8# zyurtxl$Va1iRa}6{~z=3VYY4pk5H0)!N9lP=C-=6(_iUJ;5x+=3<1wqQuafv>vpRr z5a6t`~T)_O-b2r88W7!1`_&_#q`dtFqY+ z4(9yeApM2D&6YUM1&QNkKYpDHj$dnqYV;>q|Dc8a&FV1$Tw3HXsp+|~%)J9Rrljnt z@6_}VHW=?DFz_VHd)%jL)i24{zTx>t6K?_Ep(Js{Lh-aW;JMbtfj?1F)*D>7!$x!W zLmDqOS;w}4PtcA%DgA*YqJTfFAwK|H;>YPP@TKobqTp$&Nc4f}4lV}59qdj?IIzXvSzwK3Q_H+Na;M~8KzP7bqmUxK2*44Nd25JIdD^i0v&MdWY zHSWx1E=z6h*IHa;9XJ9!OoNPkjH~1LqBFYHl4mO))2*bQKxWZHir<>15+1d3w41uX z7ITFbkYO#ZP}1k=uWc54Nh5Uy6kK8*y8`$}BQ=3^mVA%Io)emrg4vkrdCuMSLNBPE zykEM(C>`F2dR&xwc>r<9i-rTXU{GH4l?@8Sr0}Bwx6& zb#~Tj+kr`&DxbK?IstAHK#{TqcqV20C!rMFII>uKJ5r6JZv!-{7w=zB>kuvTam5?7 z7i1gak7`9sB_;wAIwhXQyOIRB_nE3uAOYf(N=Yo}Ip!z1t2P3+3_a# zJ5JU_zAwi%z@UH44|<+^N4=;+nIjsVt`INg&erht3=3luKx!qOdG*YRYSPoq0uw;I zwzd6H=(D;{)s5=cQ5{E{DZrUzotY_t(W`LW|=PDcN{?n`e)e|k_Vi=uA z%joVEvbTH9ByC_|l51zkEB@2H4M?Ah>Ed&ZPpjU~nf?|q(0}912UYKfOn(~~=#S4e zTB?_ojI8g0f&Ob|&Q!hR`Lf>$4D`o)_}C{|k$hU8^mQMiZv@&9`Ei+vF zv$cE_80g;;E$7fbWf5iw$Rv5=!&ti&uK=o#I$FM;Q!>G4KdZcJ3kS(`Yuif-XaSS! z4VBHOT51_KIhTQ1Yx48Ie#;?u!ev8xp>6*M9!I%>qMRX`i@QuWM#wkf{}BxGGs zzBcxNm)F{pm#m_ND;aflX^w1qhfc)88&GB47jXjY`%bp>jK&Hx+b2Lv;M zf&40l9G|8qq3KU$6T%p^op-wf@Aq_dwXcPTA>hGEI=F0gm8H$f#IAq@KH$&vmV}op zX1KV}b7>%hOg^Dhv~G&hWa0DtwcorXa`Fzon)7YbNOgckx+ahvndqA<+*s-|K{ouWwHUO?VZ4mrOr!4~y zpPtuAj?`}4gNwEj(<3$Th|>nafA6#b@VL|Z!IMtw1FvveFL z5vWz4^*GsOK=B8bQ|82X75>slP2gdt#?eqTvPR5n?x ztx9b-StND3RtgcUT`>KEC9iZvpR8Qn~5nCm0gAUTt<52i|X_Dd79e4l6Lty+&#Q z&(LOem?kZZ8yA{sMu0S5Jkxx!=cZq7&odD@*eo^-Bp%DC1rmCnTG?ce8uk3;2lY*s z7dyRC{n_F5#wOdo4)09wQE$k$ZQ^~9qrKEx$C%Yxz}G3MG+^{x|C@*9#3*);9e%o+ zcDlA2a7K6I7{2IdIo*%H?m5quI^5KosOZO z+wd9&zF9l&qVF(4Cshi6GWx;+cN)65!^z!w>53g`xEml>#P{?`QF;s)9^ z|C9P={)d8ZnC=xoJWSHet7o{FG?V!eW=4FoRbm1dDBBiQf*5(D4dN-_ z|1r`ya7;~cU`djiz;KhCY zNp*>L>+KPZ>1`h0Yt_Avk`Kly-$|xo6xcKs#R}3lF(n^J;5%V?-b=@q6u92Epr*I^ zmR7C=;bpGGo&^bOz20}HVkHQ_tw>35avv%QHm>rTFcU2?FB%5oeXWKv~NEw`kPM^SVtjhwQ zprpkmvgu2&@I1}MfeeFsxp>ckxBGBep(=KHxTH!DUT^gn1(I*2-%--L46YL@C1Y^C z?>0{dyUn%g5_wD)X-1c5DISFDzvlCJqy=flW~Y{56oy*f>R}?U3xo408*D8g<4^{h zt$1v3o@~RQ4J4ltep~7!5ZlfVT%n{#1pKK>K!3iA02xiP2(u#6k(Tx#_qM25*+@%y z;d!kUF$p9`mEHz2E=8lQ+&0$t8AOAmM>_$F%PtR)AtZGK28K1?FEXq-dt}%X)v#yU z%w+rC7(jMKf&ZwP#=OeJa1+`N^vbfrp5E`8%nw;UCRx#)!Fd{uCv{*?oi1>lRF)(d{V)B3n7(7E~~Y{y!G|!09`q=>-X{P5eC?p;T1Sn? z9X0YT?Vw*+N40@<@2Jib8E(AJI%*vF9wil>$Z)S>Ju(Fx)lpmUGTCV4Z=*EhW@}md zHibWQ(tjy@$VoKz9&2n1I8fAB*_TSV@pNnK2#^Nt!Wj!9k1`t!1Br+-`vUQt|EV*U zaW%~g%tXW3_8KFt0RFp@bD6--> zwfVH!z6Jb%l8O#rxaVFq;lm0jvlTqSc>9fcNSDC+_9mv zeQWssVk$;})I}!X>o;|K!s*KYWRn{P26FdA6YyH)zs%$&fPvhWsJzX}f3?XC0|U7$ zO63BkYj%d|+MQv#x|Hd9tL7LmsKKR?9Oev|;^bwyjyjSUNnS2h(wl8SP5}vgz4B_2 z{PKpp&NV0R7ro;#@-sHd{677=q&Tk0C-6iLA(%hrCEcRXW8M@)|6ptXFpwUURjaLt z6NuZ4e*}1+l7xQ`&X*I2RU0~^z{N@m_eP^$E{gC}qb za|Pe(Dc*EjpxrU#-GWnGWTc683cqWl(Fb)t8L-Y90n$%WXB)EKjrk@PJgdwKO(4yY zzVuBjh_q2|+M*#^9?sJ`QHW%hKzd3{3`Di4G!sVyO>UY^qw>yBTX;lkepQqE+bqd% zc8|w5pPp0Rseh$PKo+I*Dr;`9#M)c2_9!hu``cCf9+fM%Zc4bi%Cdo>6Sam|RyKE- zPFNEc>=J!K6~J1+LJeq)JQoZ^vE&HxoZT(Adu3T<@oOXVMu|_aZh-8sf74wf@It5c zf)_ch58UUpe(*s~8vrkM+93E)r!52j;^~#_pX?glzZ)07RARbo1pbxN2Eo5^+5q^s zPU{EX=d?cXADq?;{-e{P=YlcbkTycrs6fPuH;7`vc9CGbK@vg);g6uYBufW!BAtKJIW6O|NxzgBX! z?EBu_JGFp^Z-8@;=5FsB;PALfqOJXBX(NARjhz54(OT@n*RT;e#@am$q-|Ya!-h<= zy1s@DnU<7%4V&Amyj-BSebW6jN6*nV-)wCk1OC)VQ$XB5{K#i|k_w#y>1MXMgc6?fydk2|?$AAK2d*;G6!7axT2)!)Z&_dRX+LxAdHF;2Rj1mDA$SwHM4(oc40)C}?eQ|ROA8n@FpkzYX#+2_){Fva&08wFUgctmo&&xht+1EOFIjFYregkD zRbuCMoBeui?i;+>z@XXjRtx?5dz+Cafb_3C#AV0nmjuV@^0kn(S_ypbGRqAEvD}L) zg^lg`?e+D-8{4zOPWZsP)d<(RF@S+Fwnk2VMdaioH0~^ITpHJA@}ILyXK2Xh=nO>dKV%V(B>`)Vi7 z&&O}V^`X|e6Tqh^NgTtT;=4p19kSkl!BgS!{nZEz0?Da?=bL?+Kuj(6^nELc7)dG* z#2&)$`&JM!lH9aSzGx+kWxi_TU>vwmo7-1e<BpbB@oWoyO(11=ef$|RRocPFpHESrAZW>3<-jf4 z;Z_<`c(=Au@*iz-3ytcdZ zH+?Z(@dBsyf~!vJ1MlOse(=6d8vsATX@lScoVE=7&@=No$p+MycjMx(N=!GPz<+bv zAb2-@R!sN?!1J8e58l&hec-*E)(c+Xv<2NAi}4<>jgTY_%mn*!%NaMfB!c%L%kwSm|reFerA1fE2k zvQ*v!P1mdNVH)9|+a5oBcWIFw{BrnUCvU1BzTM4cqpw$ZyOG+!U%DBkuKuQfr%`JO ze8XnOVc>ct?Ij1p*<0!mKB+gtuZd<1+<3s0wSbpvfH}MPdqmZ_zIx$@iu~K7n{BGD zHLCJdLL)&Z0Y-G&^J4zNqFScA=!Sn_aKBizyVp6r(R10I^65{@ z;8WkPrB*`;RTgD3kOO5_N2jYY%lJ)Mw+H@7yW#~lxF&!M%ygvoT=#1^bXK0N`ZpY@ z83Q-oXqIRKsl0qXe%A&~x{cCZ>6%vHUZuX*k; zkO^p6`D7J@>@WnUUvEfbJj3EhYt9sq=EyXEdo*2B`*&&WtCfwi`IP@g8#E$|>^zmt zGa?|hc;aDEj1if#xyED&H&~%VCTwh0vAi5&%DraHNnp_4I6YzR+}GsVK#G@6@G6JJ zmnIT5?SyZuQgThnCxH0w6Ds}@-7MHl+c1<=qPF>bF7r?CuIDlhT-`4GV=eA(ZwoN6 z!97u*<12qPxp811w=I(Un)=B1^sl7CKx|jGyF@;))ruSe(u#e9Ff8BwfxN{Wx&>sM zc6?|N;0tmagh7;k?q;OpcgVH@5St7ZXLp5$%96OqTB4!ID+*1RYv>-YuT&E- z7{ob%v{+VIz*k%2n?M>Pjjs_HqI$|r30nEo9=YtX+J%I4u@vwatzEVe!v+0Yun~hQ zqPMgLh;+6Q!-cDgHeyi40#i0(w#+45oo=2pgaH_-1z-3>7kdD5pb8|o^;GWLZDh&y z^X4zvvRkQzD7|PyrC0Y0_7CAKY?UAGqzbUhs(1q74;{cd|A@0v-^t;tdr9 zk21kFFcge8R1l;Xac1DLy1zKDvU)nmL2F+*pC!)sftr zw7EaEW={Z--xQ>cYnIyr-B)*Of<;^QYf7HV?2x}vm0!dP4u;o+DN&YtUZ_TVv;LJJ z2K=>>>Xm8VGm)PdnC=MpjRd~uXlzK=KMIdgUpl!my$5lv`jN-gr)`d#wqRJR-nDnV zF>N!0d{|tb|4vYW%Ze%s<(Vp*2B$4_sw!I-sVY>^)k8a>s!@GOU20WU$aGjnyij?w z_WJ|Y|Kq^_z5cIxN*wq9#oEc&TmQF#-|_zM=<&cC(odx)@cqG5OaV_-KUh>L>hVUx z{WqHHw1M=ybdtNy@IayKG^$_Uzg{aULOekRKc!+GG+WKsbnA`U0(gor_sb$}079Ih9P)Yk&rhOwsehY1*3?1&#K}U4) zxWu$&wfX~Si0okgb!tf(yl(mmDdK6B$&uEp5=9$|sW=$bx*S$zgOt6KBcW?n*@;G3ZL=X}jfz^~jZdem9X09_?aXVeQR6@w)nDnXT~PIR zEUKqJ^8qJaAQBz63_3(5x^4Rjt;T08%Cvzfl}z=DDC2y!`tRHIuOwqY#=`NzdEJ^I zdIm=i;n2u($SATN7Y58wiI19K9OgP0W8c=g9UJQKpj({!<|<6o%(Akr@YzNh0bZ)4 z{kn!$!VNrFVhRw$%PeLC(0w@nku-RYH6LjK>G_@@ZHe4LZdwi-#XEZN_11% z@?~mN(m&aL1Tsv|-L+wwFAa-x$ZVyDUPj?F!qK)` zpMk2AwRW;?dd*zI)#26;L)~^Lct;Xl?BL1HDiG^!ciR+sN-x?rJzsZnE(~@D!52BL z7yKNj^?@&TT0i(jP8$Hf*lB~{OPsb0{3l&I%C_k}6)x^qV!CY#{RVLU3o}s=t zuQEHGa1m;Yw@uLow?r6VDA@y#Yg2!ZNIrWuQGVtHF+ssC|-krxdzDT+62Au(XFhSnM+o%b8qpR_`dx zyj=T_9uVIE{>Zv^3ivxENoUy3asu&B&JWyEZ7q@N+Bq(mGUPQ-ASQWU*a5cA%g2}7 zD!B2A`*yuAq$&kZqB8;rmJ1{&mXGfow={u5cr4j(&Y58%Muwkn2{xy5W|$aa9n2m` zbLKazd5<>#od7;rNoNMDyfki>kGRs9*ho-DpNLZ1Aj*{5Rk&T0KL6<(HNHuc1={#@ zhgk7kYs@$>DA%{CB<^@EcBb4c^2OyA_i}AldO2m@>0VBmceJxmgEqr(E-v)OX@?f1wi(LqJ{%TBnZwYKtc= z;1`utw!VXGp zpGoa%)&$pf*ohaav2E1NLvf8#>Ye{bc`LiZ538a(eON>n)fady8bNfjk@#yT(sy4Of zle3%KZ}`4|&sB{)#foB_=(a4+XUvC{zC~U1y~x8yG5sbpOdE)mJN7{!G6l$JTMfW|HAS{1 z!3CqBU`qm3#Aiu;fJkRs5?r_{Ey(LOpp=vKuk18nXhwCx=EM2Q{d4Q4ra@iX?p@iu ze!i^o3KEuHW!XPiJ%blItrxt=X?@^6r}cvma@qj6?zBPhO@E)aKiw?=-|VzO@E4pm z0REEG`oUjuS|9kUPU{8#r_-X{0&H@G)>n25fQS|E79e=E3ATZuV7yy^;Bh9{1m2*e zd6ji*5-vh*@ooXy;Ffg|Fcge;3!bB8%~>^ufGCi3`)<8^uW^k4|D>d7&z2jztJx*? z0Ou=7WNezqUNGavfHU|>V)|+uH|S@Xwt#f=!QqjBg_Fi9OVghVgbAY@7cyHUZ=_F} zdpP$nBU<9r@K%HKEwcT*7@onPI|S z+w-JiEwLwIzJD@LngC+A@ZG{LyJbg0SdGyq+bh5aRIAv^MqL8&ICGnEAT2v8ux)`e z`br`l!f~T0{(LK81V{4QY+K?C^vPK#0pbp6umG6F=bICVhq4ijtxL%}$8K#*djhk&7AoFyQ5xHd|9*FqWA^Yfjb`P1v?>z1weeUAR1&EL-|H36hJS&902f=?F7 z^HgM$iMD~%VIO%4X#Vu{{Kk?!WRmMH8wKw-1x;YLg4%W!Y%~QUz(B#p*8I{MOq+rU zAPRPu_}g9ayVYn9neQ}#k5Wz9VCDi#77S)o?P)b=1Ch>FGhDc;Xf=bXrKW0VokAK@ zFqo0Thl`Fvx2c-@P4fuw3Hk|u;z5SsPfV~43AOQYbA~WL&34ghj!DF_OlX)fCwHWukbVr9wb?^N2Kj^)$%0$o5n`)lbzNJeyY>@ zz-KwFAN+St8vvi}v_WvwY0JQ$U6~I6Id#5q4=%PUFnPtua z{z^&DtgPMU3by)Jud4G}^|k$`I(Yc1L?HXzc_Tsb{ZqLWWa?|K$l;X!l@Sg+&qynQ z&r#C$&XeK66(u(WV$lC5&XYf+9rp$6z&4P+sa4jBZTU^d;Ca;SyCQJC$$D@C_-Q4b zTPg0Q>MgZh?Lhhc!bXDLgY_e|Vq2j1=@@-VPl!tcpTFG>%umYUp|=W7%0HzxyWMQp z0@k(Z<+e-DC*Yz%Qbpj=*0xdLPt0GZfWKDKD=KUK%W%`d_uhK`@`L(X`^lqpJ6DHa z34i{hUu*3-zv$dR0;W_^|onQ0NglRCjc4uK<1kN*#`kA1uy%5;z57`b>4rlA>9JrtfbPQ+;jbJ9@dyf zu@B(MCuy(Y2r>eJZ?`_40)9wI;uChxmO#A0`GKETl1zv9Y~+GuLiQSf^vwUx^9c8B zEZE+^N#n~g)*q9=uPf=K?ZxPl`8V5LLV??TVoWXbD>K>zaGs76c@V%hoF4Ym1t`P9 zqSW?`{@b1|U^08M*{%(IpWDu-w=hB3&a{_)>m@~wZN?Y_2FCdBf6ReA^=W2|CUBlsSVq;Zd4||1^9&U1Wi6iq(sGGASI>}9vN(~$ z58(FO{{Qn)i*vNiqt^B*AmvK^Zr|9wOqf;ve>b^NU?6u-B==h7|FX%A0|UAHOXWUn za+AP7?$Vj=dXm+Wp~<`s{J%N|`pP0^0>>k*&{5zON;p zQ&Fry9@NNw*bKh4nus1>QsCNqeIRY~C0woq;SH|D6VRa6YlGhpkCY%xN-Q;TC1DmD zC<%UqJg>=#I^{jproI;Nl}g&)^G5Levx$!aNmJtIjkxn36)Jz;2#!y_kCq5&C9yYjrzZ*(9XY_8q{zClSc#-#gLIR;Dj1deme_1ZvY4H;vF zzMH`CT$cq-D`|0wZ2Ei=Jeyn`h&R{E#e343(^d+PA$P;3bh1_(Y!8?R#$zjdGR=q zjKAYN6XM?){}}KkO6q#p4Dy^wOad99JZ#4GHfIHrp8j_}Y=%z8+yCUlX1~+%$tHtr zE&$)E<5T>$--oA94<(~E|G7YfFE=M`0&z1L_r>0rz=10XXRvV*cw7Pp&eq8pcvXT! zEw?^w1MwYks6N7C0+Dr&JjMcCtty1yAEASIm+2n{(x1|g3(+5j-G}oC9XbOau_NT* z4UwKyx1A09DfRYVJ%~;Q{;WRoIE&#^Ko&Q<>?5*8XDcHDrQ}~gJV5%hI43Cbk>X%g zE{O3jt|Qb84&4t@+69> z!p94a(on^+K~@Oe4pJb+khsp)R81gmwRdH$JWjZ+Xulyg&UqLIX;~fII8)Yan2V16 zZq*unQ~#!CQQ+@7trz?~r}cq<;Iw}59Znkn|IlfJ;GZ~c8Tk5Vr3sN3gp@gXIq zXHnn}J8cmBQKt=nZ*W>a_(rGofj{ZAUht=!7M(?5y#3G1D=e-DM6CEMDi&-P3C3qp zv0$@XP|l*Ro}GVc{CG_)+v=7rbfZ{qtU&JFv)%5uNv-llv(5x?^8B26fjnV;<<=S5 zV}r8zLQFY4qwoqNO#gJB zeyi*!6f!rezd5At^Gu`#X?#jvWd`CWCk2~r{=8SN*mmLkMqa)2JKEh=ze=rri&=dH zcy?&@FQ-AcyO&a32ojFcU=o0a|8V)hNT ztk@hZE^`%#x?4=%q+Rh%>(rG%#*+hr`a%L?prmzqkJleQP%<)jHb7)(xKD_#FS ztZn-bYvUM@HlADAU>WS@t)9VFKeM1-d}o8NNH=fwbyA~x;Sw=3dOvf1UKfe5z+Wgy z;@zdQ^X1Va2-6qjy!&N0rYp58ub7>mzAeZNjJ7mm*x(88<{*tVsa%==|1oX-H_Zxd zAhmsbi50fj*7U#*d0HaJ9zg0`kllP%D{_xjXbAX8wb4l>6{^1LQT38apEu4dMwPQd5-;c2JsrTv!iE)8F(gyiwAR zjq1X_dZVj~aoGH>8t(^Y#7Q6(N_Svqo~;#rw^e)vaGqug(rdu^N;)!F@1(y1n*W@m zOi_(B!JYi)J`;oDDvf$Dna-tS7M8kE+xL2F%DINFfrk@;BjqN;)|f{ z(fM$})2+})QI7i64VwB_*2KWT>i5k2gIfC(ZH)v>Aa!enujX}@>ra+vKSAniGry7l z)@WBtlCtWqvFc6&gX-RIPVx?Ol5rr;5`Ni|-xTHEw6$^=NGqiW?D^;PheUHn>Z*76 zVOQ(iyoFJdn77`de!oyNGI_1?%5<)hHw)y05ZoQt(7H&uu1vFtfRFoFJ!7LnA<3 zqGMYU;)jfX3`pk-zokFs5%hrEv^+cN!Hd+~&o{F-foqL40eq8^#3Wm1xcId34FL~R z)AdzK=HLVlGHJ0H@CY@dba!F?oWO9DGui=6m}n<3&Wp@ms*s-3^JQ{7rCbv#YTfTJ`lf_1q$$& z>f-Zcx=FZj?a@L8?RdVd$AL)Cli#c;P^H!K>Y~a^TYj(d*(+0q|IBgJoo70wo zuX%26kMxQ2-MM&&64PBi@H?G02!6NI2EgxiT0i(&r}csV)oH!pe{lLx2(9)rJHu#%CQ2ut0K9ls8!x% z))@ot|LnYwlPVi!D?pE(S8wq}e)>A&M!)0R1^Ru=Lsh{mpM&McKCAFQjMN5xLrKwl z(%iViWX6EoT*e=uOJ9TL#_sAEqO|ipX>Q+WuEW)<>5m?mL zjk_YS(Xz6zCpLNpQB+AP#}E=rdYLs_k!=hr8JyE)9kNRTK_!FKF|1^`$EGhVen~BO zyZ)88PJoQV9lhTV-=9>)j^6KwZ%-ZHvXBB!8mR?j+6mw9U)TM9KTHh&CBa(VNBIuk z?|*@g^UG|!j|1Osq!#cNCCM*`>GHT@_80UGC!eRJX~_LMBs zPu?M7DY@xcBSe}n7VVy6i03`l&!a#F({QCEHl#l=D!-glGA2ue@*fOMP|jeGLIQse z0uY51kEs$NEd=Elv$K$3P!$vsjES(2Ku8PewkSRL3JbyGKw@ZF2+w}o6sE^nj|>56 z&qZOx2ts(V1#3Y72!kC56#e|l#=7O8 z%WdLIzeBU}RJ-w@=b&kFTH9#bm#b$@MndPtJ3Zz4v?nm~o2coF2uxnAU}Qc6(!yP` zb)4nX;B98>F(4&~m)sLA7D*>>HMtSsi_PboKzx5uar$NL{4X4V-uuCah6a+gI z>_l9%4j~nhofTlvA-3}!b;zJv{Sxbt77%00bmFe>qve#PspG?RmRYq0#Nd6E68l+~ zFek}|8IUfypx6;hX8+p5Nb93clp;N0{vVnCqHgaf(&v+s%pja`cfv=qlsjSlySK&Q zF<{^*67ouZwe^YWAkQ#I83Il!skXgUe*)K>DQE(5BJs4+q}Dv`_2y|qK%7N9t$3Lk z^|5dkXERaPbaDpySu~XXpj%#SqR0*=kP6DKAMiqrpz|sl=MpZMx`eMgQ9(Otlguzc zq~!-hXA4vfm#Om7Y$b#%6g<&L1!$9Op#qVT3Fzu*yQo{PXt(lub;=Lx-*mSU{PF*f zx;GE3qblFWr+X-+T%bVMFKvM!P;S~n!%_(QBFjyhlytpKleA5nCTW%~NSm-pkuAlF zRgfD%1QelS5m1CEf*@O1gbE5lK-me4?85IobDrm%$vJbSrReAT%O824dFFlJ^Pcyt zGk5M>%O!~Kuv|XzZ!DK2zSD9A#J{y%iuezfDjW;(uE%LHxPpyt|c5-g~Ho>X5^}_m5@?TLiPgrdav0C*az3c-z>6Qw(yCLI6eIvyxy$G{9b7CTSE8*sPHkk z>zB)8aAaOL%F_vVLW=f}e7YIE>$NO?W*?cQ;hxq(>>ezd%E%3Xky#oZ66fH{+hSyv zh67CMr&R#nYN#^8udy}!(KR25U2GCuMtDD{=trS_?i|UFD5}RxsrNVNM<4KW_3ZN%dPySrRFnP+v1zB#-yW7*p?OC(U7&j2~VR z3uY=}8l^Wp;}` zJrK>X`T@yk6FvnWr~W5{uhNEeJQ?jGTOC3>2qv#U8n^(;rwxQ01oAc#`yq>TKzn5G zGos(Pi5h{jZGmOSqQDbP{>uo@1SMCec8^Pv(Zt-qWOE#2YC4thTu`OKve^3!Qk~cn z%i`}O=xWNNOKK^iZ}!vqUuPNi39Y`jIHX{8N#`c|eDtD|ObW^g8Rq05N2OGc{7Ok! z6|NWb&otD3z2)ReL|AxSD!AAcAthUcI|q5-SU)sJnqhAlo({cf1)gAi_KG|$*QYJo zlRY?sPMBD+udB_4#VF8N~YcRH<{WH78`f#N13Z&g9~y z*KKF12;25>R9Dh_{c;{mF*ztBWGby`p=eEEP60L$Zv} zOpAeRL3wbb(VI@l29YP7>~?7bc01}P>P>5%V$wa8kPBUWYlWN5EOn}k`E)|Imdw+p zwY=up8u>ZJq`j1|-cVBsndm+b-9?v8(-aRG|vU8K3YmUA&-{PLg~;kQgxrV&P} zVm~u;2lAsR@+DJr86g{4;*Q_@nr^^tl6;y+$mLk>2NGV0PB2_mMXpiQ9!vc~C3*IU zgK>VN`bCZ(t>k9!JyX5OgiMcIDTd*At^6{sXL*??1B8%!e)*_`@Gq!c_(T{FJ~jQ` zdm@b9x%-#+Qr>Z z2^Q!W`%}vO6yiL~C5VSwE}wXq<&wl(SgwG0xaCsBTU)M(_`ZcYCUrk0;K3h3s{1L# z_ggMS{3pv55IL(%i;|E zn=CXOY)UL4q=WEv#5{_DyKSnjFDx;RL);KCX9q?>RT?E)^sf-t-cXReL6t|_Z zn#SUeG1PRzNuZ)X1{L|fQUtvn{W?-sZV^k^_M288Ygz!HHq2CzlR+A;%Z%Qb4Rh~!7 z1y*HWz{3nRnUF2$ze9*;PJ+>>_y&^8yU5R%QF)pzsTt5V-ee}F$|R+nFp`v*JA3+r zAGgNWp~kO5%Ftl<IV2z1ooZ@ za2f*~Vyvd@2)Nu(lbEO}CQ(xfnW#RO|8Bw0!j;W^$+xj4TmmV35ZCHZgvn`9UhKX; z@LgqmSD9R{2AB$@Ir(ssj`?8bC}^{eG2f(cW0da|FTaVrHJP@>WI`XgLr}EQp5`_S3ulg zxg_x-%jFX{TP{J|V!6CrIr$ypl?9TJX7L*eCi8h?SVkB%^fwf~VM&~!zjvVFqo%}C zLY64Kr^nj^(2k`@$0Ur{z2Vs<8+5V`hm>6bVa8Aug!4ej3}rq%Zi+q;sUGg8Qk_*c z_v}1nDqRU>S!}KHq2{5W@Yl7d^M(m5GXkwX3Q~qFA*&s;&tVOx8b@V>3|_rWkk2hO zMIXeFZ<4ENn0kyq`nyJP`qVoIMfTB`8!YC#oA6J)t4xUA#$pUkF_ipZku(Lq2+-7S zpPTZ6-9A`!SgazWWT|}=KeK7bQo%OGbmo0eG==@`EHZ475y2v}f~pOT{)H`f(6V}L zELl4VPeaWmyx4A-rNUa1y~%{ngDT41(d>`4G(}rRz4co)Ju8|reXf*{HQd^(q5nW1 zD{~|QQm)pKZ?QLxvQ10ob{0c&rAKm;n?Q8~{zr4c5E5?;~ z^}*6QjLH;3mL}uSKH=PSMPwYhsauapo=qn^9>Ry=KfLVZ0ZWM48POG6RCXPNv>p&N zoss3i8zz2l2SHa>C1y_bwq~^AsuOpsq#dn!7Npvn5T9eY1o63+%P0P}<&wlJ7wOE3 zzXIa(Ete#|z;gM-7g;Vre6i)cy#(uU72=S+1R>4h_YyQ*Wem#*qlW%of`%+cTAwg# z=1eS$D*Sn7>~+YsViCe(7mzk-q>W!9R=&%0-N{$;CYhJI9!=LaITTtAV; z^9)>8foU*d9b(?4!wTGEDlm3MBYG)aqxAA&k z-FOIb4mT||h44U7V0 z9?J;nagcZvH*SOQxIche#fS%5EU?*Jk0795N~0*6!BJ;D^&bRVjl5h>I&P3!f&k3Ifl~zbK$Yw*GW^%QDXB*BN zaSzb5kTTN@f!%OZT$=CzLzNg00Q|&?)1Ay8gmYlkKWICYm_Z3wfV$GnuTo%G4w9aHy%CH;avgN+F~&BWACZiQH|?fx*zv`!NqN4FbmS zGcb}XLgq!*7o!e9E2_jzq#r|<4Hh$tuSF$qF|8s`T?4PPT!Q!x%jFaQ#&SvGJ1tj0 z{5#8~h|4iUskwl7vgK056_zU?o@%)y@pQ}O6VJ3(G+n84l z;sL`LEGty`sFj0EZ2$%$3)`9Or?TUKi%o_~H^j`<`2=~QYq`;Q96YjOF*n6Ohm}?F zuB@4LW-M-?(GBY-tAZOJ-LUhD3ZauVgk&AeLOo_fs)e0+j^z@>^DLK7Tx+=`@qEh_ z5Wi))6!F`ZD14zq|{j zy<|%Dc2`&66jkMpF5!JRC2te&m*v5umh7M9!Fo%!WqI%>$e53HuE8m*;%y?%h6)=? zmI^{9Y#2u4;8Cf;qr8lt2M26f*@Y0sI!M@#sSzD8*>MAe6}iFG)w{}}8}=NTDG3<| zn$H^`!2lgee@eCU1s-g<1aY3_@`;C9E=jz(h?AD{nw2@(0rAQ}BBWXTK%(JvV^~H=L)km7ZF9SUZ&wmycl!p| zmB!fJ=-F+9_?RGB4G9@%uHoJV)7MNDGlc&#l(!0p*0^Gh`0k4-C?_SeTg@LFX zFM|46#>~4kUyDD4o!lj6dEtf~!WVsaaQp@ELw+_K# zDgNBlFpiP1leQq-(@>KL4+o{|#G|xTBy2WRIblm5TOKjCnCo3Xv@(Xql2sgKSst+@ zx#%TiFFA+<*y)mcSCra&vY4fIcR z5LR90W!AUcRAVwB>m3dQR`*G($BI2|DmIx_7-}M$%wQRrl<9``5FF52X2o18EK3ck z*F7`uvS}TnWvJ3K7#ib>=`6p8)!U}7(+S@O-QD4V9_7v*;b}Of)QGKjZ=quS*p|vH<#|uLZNQ*dab-q4*z|$)W`K-cwk3>{ zHCL9oyxVlnWIAnCX1Z1^B*u#QlAYa`TbXWQt-O0?`=Me*wyuP>_^AxqI`Z;QtE1s4 zE*(5qY6~N*2DN3-66{tqTAl_i96jpH&jw^y;KaAB4PghUfk9)iTb4%*+w%$3n!qGpnG zLfWaNq1+pOY>GXx!;-~^kcP4iZ1=W-wEL+ku!JyT_mTI69_^kscBO>0Q-S(-5Pu7U zCyim6kOA|;jmLB-74RQ1>_LSGm{g~-`vD&ZDN`8X3`0#JTxzJYPXPy@jp9ajT!Fr; z^w;NV>V~)~M&!0K-u!@C)6hHvFf5z=J$HV^uNHu&J4(lB^ zq#s23n4>ryHsnX}E!#Ijjs*FHfkA$5y4F-e1|pSt-cF5i;;tJ2!F}05Nv= zd*#vT)@Gtxl1DtkatY$?ESFE5Z@DD#4wfq*-qCU?;$1CQMEs4-&BE9l@L(U1YUL*0 z*K#T1F_tSJPFXHVJl1mg#N#cOAU?oyXmH!vn7l$%LXu8Mv-m}thAqahjF5)X%AMXK z?c0^mZcoH1*Ia~jrDE_u4WzGcnixt6qlW&%y$=kSwU~YRpP;gt3CjEI+*k3|DPP6g zf%_`nt-9|amTOEs(}W`sp4=CGDB!{NAk`9h_>Nf~GN~~)XBoufC_&8{9|M1GO7+%} zLviYOqmm|MqjJvXF&joY#}!`Za4Q-&c@?89I*ikCt0T{4+Agn=>qa_0Jw`(Gmz84V z_DD!|gNyhS%O!{>SuUTr+;U0c$(Ac1KFx9|;%SyEB2EoAvrT(H9u$I9vkmcB%cY3N zTdsikK+7eGi!7H13XVR2vSBI;bw-)5S{=ktN{;J*lezCKNo<#(A2M_A!s%F(dC7tLcOhD?-j3a@oNC z&9NGDC2=u)GBwgk30a1`K*FsDd(T!Tq6{I2nY?~O5;W@2EC~i9?g-g?jP940^FJB! ze)T5#weao)(&|n#%4X2&6w}>ja5ymsF}JmkfP)f9bsaPVxY9VEUIX}JOA-FuP$h(H zAL#>xTu&qf2FmC}>$`}VfvPBoInl=i&n#?dLYPcgWT-Mih9dX>83N0Q`AC3{c7P)l z(q6#(80Tp}f2k~!b)``&C1ld%J40<*9{kPfF|bLd5lj8t__wZ?z{8owleZ^jP%Kn# zuMz$XR;r4`e>R@V7}Hb}leZ^!lO+=w^LB!9RB{O*yNNuV%Raz4UMP25vOh0H@$%%s zzFAj^$9%L#?azquky9X?d3O9P7zme7e75Bh#OGMf+cmJvkpQx5Af#FRBJUfP#2NZm zKCWT-xtMFpdyiD6+!x?X$e2{~nFD@YkqBCYQ+L!a(=HsXe&UE{n&Cvga@v1&zj1r? z)#BNuR;$g|!bu~x1!9HbR#jGFJal6|JENPktO_BU1u0?&F%fhCt%6j&i1j|>MV8J3|I$k4Gnjlr;iCZj}Aa1o>KJjA9C5e|? zu7LPe%cY3<{I8T-K>WJZOA^0nxqRZcEteqfwOk%CA9a>8Qp7X*>qMz?iTQ-La7ki5 z94cHsF`u9nE@5mm5j@Yb1`HsAM&ddaxLCuT1p<4Ty>ZJ*p4;k)P^rL$|S}hkdgiJ@M=LX*c zzki36PL@afPs=5UU$tC5@#~gL62D=&0%ATKEM=sK-^Akw!W9v}Ww{h_ujLAe-?dzl zm`@3azkK2ktX_inL(An6Ux$0^DwbS%;=`lT9|^ZLkHDn~=}E3&{aZ{-`A}n5?w0mG zvUeV$l zG~*m(o(w4Y24KcgjeyH7bu-|bmg zO$AE{mm6xv6@YwTPS!_4rbE80MVK&YsF(-HhuOrCnaML1oJP2_p-Kto8LEOwy2Mar zgr68{3X`>u$;=GG35F^q{DGln5VF%ssBTJ+K(fkA{-zV!&Q|JYc_yDvtTri~#?EH5 zJei&CF{3q|@E?Xs{|G7lxykZ$_N<8}4butv2#ZXFerGFX{;sx$gtq_9+zv@%9%Vrz z73BQ^5+t;|!Jl5bz5_O(A5blc#w5WqGi@$;~v5&EFcT zf@6~1PIdu=w!2N^KzzXDrh>4?Q076ajOj=fgi8(OU7T`aV~3KyM#$dNKUj6N-(tLC zu{{&1q?t^}gppBB$i5?59EP^Ldsn%f+1XWP(I>RMb{Zjb& z-`PA^795J#Ol3(j^~2@WLuUj#oAZ9*5o5RTQ&H$?rtmc3g`hTIqw%9F?I{*O2rzfT_^F2CZH16XWT{mS`7SKAY~(!M|_Xv62$8*mrwkh<&wnD zTdsh($8ss+e_F1H_zK*MlFz1Y--ZW20;zU-#JqDST#C5U>J<=QZMh^dZ?K7NKJibi zUV`{K%jFS22rdlJZ5(EF25vjZ;352#v0L@g0v^zr=;d;CE0QErA>m%|t}m2$w7D(d z#yTGG#R_@BsvG6ELF9K$$eavyS#SwiMXOAPamohy#=2aQ-fki-A!KYS(vmEX7@YdR z$V9pa;*rAFN~GgPXUQC3BArCYxU4dnNTh3XMtYZtw3LvssYpvrq!Ua#mJ;rdXe9V` zbv$4OWr`(aKoa6Qop~~m5Z8GjGLC&r$!S9Nq`~T&(ej;39xm-@N9Qu;I+1YS=A*4`*%vj8Is2h~JR(Af_Cz!u5NjzW%WjjOoACpOEY;|co z!mqOfuo!k;Nd_UiZrDG0z|Jc>C&EZI_)cM)82Ya;<0MTu!}Ph;mgZYv9g^&#@^Gmx7i&6P8gTnh<{dfdMC(;`TnR@Yez4EtnmJCa>18~=v zvb-m${IaI8EP9l(&dC+KcLhOzY%gg~LS|ChvnOV4^{$V7S7kA-UWsw#jSRXfH@%>Q zFcQ`KF|NE1)aZ(#s0oBV*hk_f73zP_giuPj#!zX(n?P+LPg*Y+yeJsCx}SRfm-NHN zqO1q-O-m8JZK%n6;(62~&2y=xgvS^vO*k2pQ#$Dt#-eN$;MJBQyw*^Y?*e?lP^E+q zf|A#A%cmWvCdt3xq!S0}SB<-}j{vtcOGX(XA8VDKNH_voeF`Nx5+|KPNsqQA*jYxS zGMwW48uL+&+j|BF!@l_9i?-}=#2)1 zO7VmlXy^AC<8sMa$V<`|Xz=S95-8!fa7qPwdL+jwGBt zpl?*mB2m2oKfT6Z86Wj#6Nx`Uc9p*VqP5%$?aBv?V|F$iQEQ<(P<}C}F3Y1w!Ahxw zT)V<;84qs6hD%%Xh=VF-w6a*LD8q%`$GxtWl==Pww`ayEol}=fiM802Jr`q+*>uOm z;%}VJ#50krAo~XsyqfdekB!baPltsyppoR0@3w3^4p>n&r?8b6c-$iDI+JJM==W!) z6QteHMazv;wrC9cNdzzLPuOdyDTLf+i7z)$8Rc$6`VnOO2&VcGl=%@%^&`l*#qEZ8 z_b_pn5>5oQnXIpk!LIV_BUw`4#HqveUb0zz!)R4U-C(^4o4GICXy!T@I;5iows^uu zP)j$ZjBx9$BUov|<0SbXPwqN0%Lta3;7SPDrZQl=7q~ffn=n*jBhoVFoq|+h1xP^a7x2K^dAF#j!YE`BA+%Or4<3$mjWTJQLAW<4`HW;~mIwQR z+(}>PtdfS}cFwM6RAQU#s+Ds!t!X<}T^?d2Wayizi;2NQgFOG2kli65}B!M{PO`^Ut5W?S7qCJyi@qi_WVTQ1ojc%bF-i3eLQK|I8A*vi>dGkN38O(gPxRXhike=0Zw*7d(-YBES|0)~57_oI^L=um%T!MHz%jFa2 zTP{hwgXIc{ceGrJcz4Sc5g)U)?hGd^B zr&=ySoVHvZ@fvVpfNl?FM*D54&&Wqugw}3VumAmEWP-}l@`MpPf8Jwxf24g-LKv}I zGH%6h=f(DP)%`8FUMD{eN4%f?*9y2`{{LHJ`s zl@VSCN@ruKn$f}BXwIlFe5o^JY&ObvM%-f|2g$t?$p#Pk+Is2hgoi_O>)?!j;r^^e zCuQ}(ky)NQ1v-*MLYu1!KUZa6HCOeh<8L6PK*E;{RZeK@UBb3Kz|?z@sy7c0F%>8w ztg!X&AJ%)3tvAovN~ZlvmVDJp`kmNxx6e$RQwZ4u)gElcS1r=-DKV{9@m0P1?P1dO zvZ+v-FjArRwy#DP?f}sf3Z_UbsO;F2nrInM+0-A*Xc7Sbtv>AGH*YMGZ zVywyRbQXA+aW&oD4#YfDU*If9a%+N)>|mb8$gS^bzHjeyzZFO~9Ywd^i)A`?D>c_i z?Ev+r87B89I4SvN(M+EDmL2hTP3_Yg;Qrsn{dbM~65steix3sYmz+Z}OV!c9lGqvpW|S+cvzN6Cb?XJ!cLD(3M6Hw5WB48V4jnM|j3 z-h-Hh3=CR3`wiw1{Y$p|ciUVDH#gW43`Bd$E>66S%8T*W z?d{^&*jE{UX#@NEOT_qF@A)ghIL?^yT;g_LF7=$rWs^wAc~%~PAmsci!-a#F>xoc= zY-Guq{~EX^#B#QciI4>kk|#Cg-C#WA&PzrIA>$b&&rOOZ54){TLPm`Djk!^Sb|Y60 zQM9cd81sU%P7J84A?3O(kN5`5C5V4!xqRZETP{g_ljRDCZ?;^D_?MO|B5v7Ex2jy1 zb@bywD@b+WNW9o`DdMG;DYC%wB}n zZq-U}s(J|e-NvqzkoMvA7!M-O{FlSi*(oD*c(SH3_}dV?Q1=4TRm{pqM=W(iYcpUQ zUGQFzGMor)Op^&2n~bo|HXhhOClfN@P>%;T`pIrv6rgmL^Oe)!JNlo+eh8XS>b$az z2gRmcXAm-Np&k#IIJy5%$h3ueJg_8TFmZ16vEhByk_iG`gLlN2%TL%6Wr~hu%2w6w*hC8x0l&4UU&mqM-A%jqt z&P~D2<40%7?27P)1}y_u57g(Fg==j2gbXvP&ICPa)d?A{E!T#t(K85^okDIbvv`&z z6pNt0n2)vD#M_xBC?|~6am4C@@-Txuxa=2F?ib>Hn#MxdcO(u%b|c9;eKTo75wcEk z`TGx*I~Q4EP2?s83!z7${0fx0>Ao0__A^rKu|30pw*mwA<#dDNlv=quE65uE?Tl$$1`*TG>XM-61!?m{kQ&LL!%psJh8 zGvNJ9Q%WhJQ%W9>BXwER#-g2ayiZeC!v96K976g@ z#F!a}UGy3o9U-GZbR&2iiSB)`-^PrBL(s$Ko1T^?Warx~Xp*0%9{NSh+kQE4+4a@l zg!t#iW0_mkxSJCj=4#5Oy85Y!s$x@J*$S3#h^t%}T>#O>rfJtW`|sqZP}L zHY1D{=f8H@H>`*=tnjW#eZwg{IW>9kF(w5}`yQ1jfv=QwQNC)DcFzUxa)SLru{WARr&jOQU$87X3XDy6t0;+J46_dUA<9=vQF77_o$ zaw+0hELTAMn&pzjZ&)s$_$|vNh~Ktc9-t@KrKQghGHj`rsRCWem5~2{Af3{IbV)*1 zR|W+kUB%CU^mPz`^ajFb3^kK5>dWt?qhP>X#>~{;fC}T4TP}o6rnpkVKN~7T__U!) z37P(w+ep6e3i|$~aWta~khPS#42%)QKqo^=nh5DouF+QE>`hjSkim);P8v}R#9(DP z`97#SA!Bw0ZYI?(g_E(Z+hjN}q8I30Na=KW#2;ENLHx1h@`*pUT$1<;%M}n0zhQ41N_ge+S+6ycU|rKf8i?EzM730Y=LXY@-fV~Na)>{dLML- zCeumMgse}@{BRt6vJPr~Aa1bbu|AAcJh@RROSizdYoa&cm7(Va;n#rWd-7!1GBJ}N zTX!U!43e*GPS`Qa!|^8KG$Ea-SJ;+_D$~TAkaydeueD?~WvQeoYbn%nB%9u1c9~4s z)h4zILhF0F?|b@pJl_>=koUqT9rX{!X1`1)W~N|{7)0EsUDV+iiOfMXi}BonI@|^+ zBPx%WFDwhEOCB7Fmue|RwEf8<65D^fbnJnobz;lyGDEBN}O< zG4p2cG)^snRBcY&Z=iMZ^nEH=hblV>&a7ElZ$=E}F;v*L|76X;Ez7cYk| zL**OjU@--C;M6MH2lI&UwOoSuPnPp02KwUb4yCUW(p*}R@Bw%dEkZhvpN{GNN)tk1 zmiT(ZrLx5I7CvBX(gx5CgO82jl04!=@%lMgbh-i_6oXWY4l!T&7b@l|A%CzwBlRTw zv!P}XPK0}1bsn7nR<=}xd@HQDBV-sc8!uKfX-X_3Od8*l2wAKiw>+}$z2WA&FQNPE zO^MS9y9_m%a2pfEbV3%Zf+)%Ih}D-aOvviX6&s-q)f+B;sHF^*4poVzSsu}+T;mYZ zy;jWC;B+f@sR{Qt)yxpGV#-%VOf@rp9OjL{j3eeA*6Zlc&zM}#Bzz9k5LL}HvYJ3 zTrn>ScHTO*-H3hUzQT6fWO=3v8ruac!WS-mv14C7w-H$t8=^O>b|JoJA=QjPyaJPA zI3w_&9i&nu=Ie%Hrw*3zu1QKcVIzFW!cEu)O7*1jERXn#F_|X_S!T?l@0VD{5)U;c z&LBJ;lq~v9Sst)p6-HT17-fDKIaABBWoQ$AZgMfnKodsu(riB*@E3q(r6Fv^sbTUu z<8h;<=a0&hZvc>G+_L>{Bxa~mKA}yXHw(Uj(CAU-C_1uM-h{;0hNcjm+~&9(@NP@F z{gdhV2xShEcR$GO3?6Q7EeRP4?{KgXhDP2kiFVZQANa5Mp$?N2>1;HM>1^Ey@^MHt zE{OkPxdicZmdhu8(Q--Re_F19_&v*|h(EMk5%Kx>EJ?;=cff=1fRq4>h%c~QiufYS z6%b!yxg;^)nJ518iN9<062xmPmq+{yaAAOMTQQ>pp(O1<$athv60U}po-lZHowX%o znKAoDzr-?@$lA(wgpg(Exq(M4Mt04FwnT4kV2Q7z^<-=kMqYPFNJpwf|Fb9hV#u<_ z6Rt98m`TWZm9Nq)j~KGp60*>kN6bD&)T5323>{f3@9MV@+6Ne`G$F0!Cbs|e2`Wvr zc2fXXSjz21+u;ZZ9LD`6yJnb zAtKMWn?k;I^A;GWsf~D@Lth~^Gv{l&~wj|=WFuh z7hl_&6RQX6{e&ukXZV`6e7QxT&lc|7SMx2D@oA2-$PY%>^vmLzq0q=(mYXMLl|Mru z%Nn!F6v#|LXq(Afz#c^Z`qXr}G`j%XT^zBiZI7x-$7JoTZ?DVI!Ev?=lmeb@Df+Zk znZ&qRM$DX_M9N0mai2%bUxJspAVIvJ)ypT|-*QRfl;sMD3oVx-F0xz^@j+YaW|G}d zPr!qNK}s-1#D`ceMLf}R1;oc%E=hd6up4){&D*Rv##Sipa1uu9{;jF2JA_JfcPmHV$0wm2XrahIzoC6^>XEqHIr=^AzkYI8jt8z6bV^?R{Zi3D%=tzvO8mHP~jF3 z>bd@pM`q|$20!6@XnL``y^RMunEcOlTPf7@E1Hgp!@m-~AB8<+3tiX7gXcj?7wrYy z+{7`Na0ICE7B&xTyptKnxyH17B?buJXeI@?30jK;-3pnISCaL;HO(`3Lt_V(FD@~C zRbA&a;XCZ&9>8*SVm?gpRlK>`SMhGv--r0COtxnb&M{Q!TtJ2#^I_KJP&wLIO)v4R zybZ*oDE=A9Z^*B^>4msOJ~3#^XGXUhv0wPn!Pbic!tDF7VaYOnN20{TO%SDoCmO1R zknzP_WHK)6yKFBwm~0$*pGz~Dv{EfgZ1Xa+2_9@Vy^SMhVB3?u#$}J@OKH>tVeHbJ zUg91SbM2&Sxn?oF&9|E5TX`{Fh*38MLryl6_J$xf*^EzDF8I(+dG-SjuZ8OqDKpY=YLhae68gY#5Y(j zpZF7eAw*r|5r1mAd}6+AP;CH-gROPmRJp`OmP@%=WxTf{4p|BaUq_MBWeNWcN^ggF zGzk7hk#IODt;iz=5_5I=2+Dub#E~Xsb!E5366sJV!tG5EX+m3^H!SZ$F@Lnh5zyU3k8byGO)#n3;d*f-f z6yyxZlW=#LpU$}D_2QA2VR+Po58c$^n09}KAJ_hN5X{F*IDQ@SZOGe^r;i|4=g8OB z?XMV{(BmLaf=ptMhwzNZrGG8#e)c8y?Kr;*^81jk{h%D>KLP$JNM2>VjN>ub&Xi(8 z-WLnYhui5Y?l`%-V*JOV9_MYV1N}AR#>P+oFCb6O2W2lfLK`pi(stspm5pKp(3|M;^0K>dE`PeUL#)V>FCzYqBdr0ee_ z_+>nM=IEb%$NDJf?+sZ9>E>r+^=r`2lH4eupB|cU> z71H(37a_Xwy7Bcxy+%Op1UV9NQ}vm*58;n_BhgY`tP70os51o36lNF^T}(7Uw*`Sj_dFRIp(|nmi;Z;yEW6txysvE{iEUk1jt7ytCe|mHzgyw=H=F3c1NK)zUI*#=-xm3I^ZgOpZ4cPZL%S@=(LP^Q z{}Yt670THO(v9a(#CaIx(U5sgzhRskYJUU#+`N(g+M&M+@^Z*r{@i$yJ8Nb=mw0HH7$N4Fc8A#XuVeqc~$Xzv40J$&Z(U5B)@7PW2-3fUQWN%XQ$=$Vd z|8J`O?I{0F$on@jo?QM8LVb!MziNFGu-_eWA4u2#HQ?QRos9ZThI{~eT}f9{ALr7a z2>qiVbJ^$P{N9lJL%Q}q0v|Yk-DvlxA)kf(JLJodZ$rKh`6=YTA@3dOIL6`E<^M4F zKN>Puc}bivgq#5B+FuFYje6E-&G1zKD{y=cgpI?uL9C za^T+DV-ck5|Nq+l6~zBK>I{f7wUd^+3J? z`4;56kcoY@-ocP=`7i!I?(f5|IX?QUMtX2@Sb{`PCqe;9sxAYX#q(D*jhepR8a@vO00 zRztQxy7{2~8?bxVv3K>malQxgWk}cln>otkHfsVL7eOBE7KG!C)qka*HhdfMJ;=`> z2ldzIQ;=@4-yNix%wR1SKsG{ds{XV*?I86TY8R5N!%c0t|)c`sx) zB)?>F#pc@XO2}&l))XX^KVIJg#kgooz3C)y3Hbbt&=UN?*mqBie&s}bX9DvVH zPJlcOas^~3@i|9(j?X*(UyElM@^KU7FCcG&bo05P^*$#@{WsMfTK_|4Yb6bLcNazixy4Hsqy{ zmq9)RxfAAr{zKf7_3_v3?*kO`G2~~EhhaXef~<$cX(Kk({z}yIYRKzZ?;P{f#_F%a zb7Lo9-kAkCAJS9=zJWX~?ONYg|Pf&q6)BAo;xBGdb#iH|l>H;yDHF*Uoly%Ax-6xIV(}P{?A) z;~*XLfX~D6^~zho&-RczK_=cOU2GqW*B2m%VF7i8uC|=0rGJ?B>hl6hCF=;nM6NXnxnt8W1qpV zbn|PFvoN1`LiXgC-!IxymwfeBTK*F9SCD&bt$98lGYI>JsX3nC_&)scYX?8Y@l%kk z*oX8$vfh+WVO<{Rl;43ks7ING9)I|pdVEgme%P7kvuFr80{fbw_*{M`$Xy{jAiME- z=qr#r;`7k`Aa90r+y}eD|L%~5kTW1@e|`@8H1-+%iL*f{KLt4tvJ=uRpFeB*9Q<^n zKDqp`etbT__4mjwnwf{syXKG5$5%k+(tiqe3E1&-uo4_sK)UuzL9Bp06O!vrFXmnT zegNmqV=x~7+x{2_UlE@xj&J9PXH)Gt|8TwJYiu9EeDPPvk1mnc>>w9gzGM)=`*uyC7f4F@JBW z{c5Z$mqDg5zkLVKee^)4@I1=VJL`DQfP4jV2<9g@KmTq23ovijLpDMF4$_ThJ?hDC zvOSM_eGJKZU50u+;?(oM?e9LU-|Mk1Gw)DYih17~^?fM}7X+<$W9bw(}wRobUH>oQ1p_((NyNj(mUQjD~de-^BXY z3mIS?JRg#;GM|q1#kD^j>&$XU-Vfaq-C9rC#b*K_&U zkIl<*J-4y?55oWBkXxXfV#wnm-SP`^l>c@6dl~zNZLvSdhvfI=4#DwHxPNdGzNz+a zp!|=xf5CmoL6Dn4{sQt2NWQIz@tuPBR(wgk|LgJ?=iP|gjnheIumtx3&VX!#yg0}G zfsNIF9R2DkNWLC=Fvk6G$Za8agd7RE59I!k;~*zMPK2z0oB_EEvIDXP^Hm*WBjm4; zC%!Yx&CmbeDX$ zm9ro8UBC2m8O~o0*$w$Lc+SDT_PiYX+fMNOA)r6t_>VdCpT)TQJLHYH zuKWO!_Zt!zXKsAFkG-M#!I>ME5zP-9(7Fs8P?R{potES3Lr zdULeQNgXrkce(s;jN9 zA(pHW)-_0BS|6U=X4>dubsIr#F?gB9`>2$o9glAJ8Y}13mYMdvPM{o({WR^ctq6EL zMr=R$;)@2__h6q*S&_q@VHF8bTTsZQvIqN$v zgTzAr9WO$D-rdB1@jjZTTnPi#m*r5Fi~7GK_WAp1drDP5_2^qLoo++22J(aymrE7nla4IgS1$io= z@<-`j&M*$G6$EDqh}tJ%Psw?e`rLj{UgX%fpQJS@tAE4HXr6ZT_g%;Sr6KwT1*LmA z?#BNE*qc)FaDxM~dvBJcWwP&KaFraZ`qRF{LJ!VrS( zNA?Z@s*MnJ5Oj>vr#dv_>buAHinh8HOZz<7=WU?L& zq7pszmkj^ge=iDDeV64YSC0x$CRc+&!>IA6{#bwZqc?<$#-F?l_Lph76 zRF>n)uc+7dKf-<>bSnSc^2x`^0iw-)RP_7+nXS1$>dOxZxbNx94-B}U>B|oaxKHWJ z4-UBh=*tfYxUcBT=LOs^^yN1TxDV*d4-MRQRp$rDPK@hzU;SYL*Wt|nHRtm0z0YUtiw+94CX!I2Wg5CQPI2sU)^msL{`Uif0Q1ipU;GHjA168AbG3}zZOUh3t z_Hnd341Bl4tLahcCr+lOmUBh)i{zQ(esReA{p3f&D?e$+&kdoz-{0;RKCWJm=ivXA zgMTFl|E};Vo?>-@A%E9mlKZz{#kbdmbZ`?UPxX0^;*+(SuYmp@;CnKf{|=VJ6!=;5 zG`~)Z;27|YHJW$@{-=WPt<=r@8do~HT3!7m5jK11`Tf&Y&1aryin z^gA20eybM2kHIG!HSsa{b>O?8_%Zzd9(;F`R(uWoQ}nY)^Eb+|`um5-xOjS@--Ug_ zZ?t;wIr#R|HSsd|;Zlxjm&R{tq81L zmtk@7{6YAz-(H{<(OrVa!MB62kYn}t68Ii<;U|BGqo039KdUrYW`J}%kkBY z0mtw26vI#B_q6^m;a@#3t>R3r(ft1Kvk3g!Yc$W#*_VUw{E6mOzgK@33LlsM@8#e- z;isc3G!M3cpF6;>{hj7d(;|2vhab)xUBB0g2Sfi!_zCXO#8~h>;ETcI~FiuiX1pSo8os_PH+w+Hy*`}FaJS_BiocZ2T+UktwUkDB0o zQVPD~PnsWqcC4ZPLz=$_M24z$YF3 z+rjrs^!2ZP$y>$Q>*&7L`4W8fU**S;*y>jqlg;)7(-%gkN2K*nLLtlMQM(G#tr1fi{e;W9; z;Q1UZ_l>jEjS=~qCH+tRRYSjVjOMwXs_#>T{`b{<0rGhv_y8LdzGwUU;M@1n`nPNM z!HwX13p9Tw{QM4l*GSDD0{$`K)}Y#00h{{J#ml8$8?u{qwYb4|rbTY!5yd ztIPd8{HW(Cl>ct82Yr!u=A~?^a zGFtyG@SIP2D>cu3Cg+m`zF2x3@~{))oHbAD^Lm!^RqsO0p9=kNK)<+I^J;&r{*DCS zwOI3fFaK25cUvgx(}8+^O68$*gy#RC-303Qb`>9h?*M-({cNN4tHECjz8HKl_}l3R z{Alp%Ck&PU-mSHt1o-EKkLy3L2(Q|)c!dspYv_LhzWYqg*UEgV{)WnJVx>O|`X^{Q z;5@JvJeoh)UG(G1<@G`_F0k%~pMBwh&Z_k-_M8w~kt#>A?A3smL5QQf$ZzxCn&Ab1gc`c}<9rbVEh-&Fdk+cfb$>NQXn zptyF~Qh24`^INTdC;aRMzVmKPaNRr@d>8nu5zi?({8vD~{eJByANtMo4}K!}Z-egv zkFWyuJ$e;q=byBnyHT&T;AcIo`8VL_9^vEa`v~-V9@YB8wFsUE-`lN;AHvVO;5(3D z_J<*|^oH>~uJwDMzoYPRWy{Gb) z29L{t;1TkF)B59}|2Oa*;CZL}72)IJd@l$8c@BQF;qiV(a>2 zyA6CV_*-G{C-B8jYXaN-;5p&dx|7@o6E@;`2l{KD)cPIpGf)Z&_4n2KGOWVCZG?|& z$6bV1dFy>vJ2(gW>UUTa-~Lz4{}TM+;EVsJc@!I*1U?O34#U6M;AeraL;S7aJKoYB zPQ<`F3w(eZIV-_m3cd?B!Y9Db)!@6I(|-8ep8CBy6@TZ8n%@cgko$y>%fq8N_`kqU z>R;N=+o;z+z$ZV@JeH;4UEx*!y9)d66Z*@BLGf!Herw@XoLwJkKexdDp5WU*>dPMt zz8E*uv7HKzrk_u=KJV|T_wXqH!Ka$%{=Wu%uexC?e?yVaMb!UX^DiKt71Ve53&8h$ zq4no$5oE!q`|CWcK=-{x__+M5`!R9+Z$-bKeE!(0Zk$H`9t?T^^F;N$biY7$_k8{W zHtKole)9R3`+4G<(C70OEaGG6yPqd+DS>XS+UsSlxjPJY2H!YQC*Udc+kHZwUadSF z`W;w!kHM)a^s}vQkQDeu;Afqv`Bp80^K^VSVNH-k^^r}=j9_kb_P zypaa~bm(99rEh8CbntJ3U%QnK1j8#BA{$+mpY+dk9{9cY?ZCIM(>$*i)cYKi{w!=% zo8e#m4xr+@Q`-Ln;7<}h2^e&e~2hf+km3;kK+wLYpHsPALSDerHakeB&+fv(p* z(AXV(*Mpj8x%-1JF42ltLH`KwJ@0D$AL-(Q)4->%*8D%vpXX2?{oz;8Ukbi+M@?J- z{}+I7e?$|F;Irg0jt&L?Q}7+HXoA=KcMG48@#~J$`=DQZpN{j#m?oYCKdVUdo1ufg z2tM(9?f>T}_fzog*vKcqZ#F{r!=8EC51KRB9()2H5OMz81AI5e1-e~OME+Inn9rl1 zL_Z(tyz%p|>EL_D>2kNxBA5@p^Do-ZY}D%<@a@%FaVGRH4SD}LkTuX>J4`Fy1V7h< z4{$^GD75=+;5(i1^+)itj@5ovBL7c;Pc`T`tB}vv=;u3{XaoNl_y8|1T91CU&9*xK z9qNN%`8yl_)%#1rdFDu6F7uWmU#cC;$`}3}3BL1v?WZ1o(%@6S*8DjrcP{t<8;x7w zXEAwvFw%@XUr7IW5CFp__#ybNQ?&!6Ik+k0;WQ$CPd}Jv{)}^f0iSNw1^xhzUIpJV zLG$-O|3mQI4{3fD_(5`kpz@Z&2VW<^&o1QO(Fwq1f3Oeu#ILoV*U=vi2H$y+=2y#o zfAx1F_#VvXH)}dj-@8`jHah)B{ce%s+n>`8kO5`}DJ3mwN`<@#o-s z-q8A0`gHIc;kOF5wa*tJ{>P!;JxDuPqs@XB!FP_<4$7hbF8IXvwBp;)SMTXj@pqxW zoq_tQ_w~fh+hd{M`?6L{LSOyPkn*z@`9ZP4bnxj%bb%M6+-CBdYXZ}5a6!n!X+)^s z`%(Uj&)51_AfI=FZ$DWpk3`V6T{@m!Q0{)#!mIsEC-yBrhW{zhpY=~o;Ny)zy}v^FpY@{l&-cHq zfS=<1b-NGLr-MtOpRUkEA^0DIFP^3Y{2lVP4*c4`X+=zD!9DQbiG5Tx;(QwV9hm>e zgIDi23iGhN_Jfb#g3rPCj??@C=nt2M2=xc+cqU@p?Hck>iioi}_+#Ox7yE&7*h~fA z?u^s<;5+hlxi6sH)9L4Q&GUT$-wF9hAb{6GzX$%cRS^6Vd^)Y`%lm{6f^Sz3*vQ`# z@bee&vv9$&i#7}XNq%dszZc^CPi25?EX;3bf$wV6e$GWamx52c zpc8PSJ{?>QzGsdmK0tofg74_3`5yS`0$;pZ^D}W@x?A|Teb-;1-@T=FjN5a;yWqRf zzFQ(cLwC~oOzoicF${uTz&GNCUm5Cq2>9e{S|8i2-~{lqN_3pO&QiYzrp860Qu7V) zGZ%as1x`RbXMk^44}i(v))?0p(9iQ)u^R1lHTWJ(z*F_<;12LfG&rWY;1Tet^R$2Z zc@BIx?gtj=)4^Nd)4$LJE+>M|$nU55@1kCt%MH44e#5#`hIn=XzZUa0`{DlJdsEua z-%;*F@EvuU;O{GcllthGQ{cZ!_#|*tEP;OUbGp5-9S_a}-#J3_t6;PSd>8gt+$UTM zzA<0x-vRwQz$Z@CapL2s;E&+bh<_aP{|vtSUF~NZErJ(AJ{q~kALZbO?xOSDeUdI0 z+wmYj^31&e*z{R*G0**8LH`HpK+Z;fej4h_eS?$^ycqm%q2K#^t$zyY^$_@OjCat% zGvE{d&~YcV2ztR6Pu70E!2F{gl@8ancFnKDxKr=vQ+x^?ydUBj4L-mJ6tAP;ap1dt zqZR*va*q>!Bydzzh5G*U_OPtyYR1Bc)9iA{hbH>wV3}godiKuWnEon?!t!p zOmjk$waqOxO_`R3nX0;m`kLk- zhRS5B8!~h28fI74WvW{mnwm3}txE&>f^1`5O-oJnm;+M>jTO%^N*VRNUHvWGjC`54 zX<4AZw_Dx1aN#mBi5z9r*M0k_&aZ5$l|m%y`BjyTwF_(O37cE0HEgPFnI|Z$W~Q-H zzPDRbU)4}ulUZ2RnmPI?DZZ(>CCVM)bJ5dc(o`cc*F;INA-PaOoV~22CQ$Wio~MhH zFk9wH^;E$@jZ$f<(TSg5Rn<^4r>ez-SbOqO<(a02C6S0TN+nFDST$$DZy>AGhDTxi zx)j4Tw6-+1wn$E@8tNLF#C6l$*_mZkRcLG;RW;Ph_p4jNvvcJe(Nc~ksunI=p!63Q zMxAb!PE%u;`c~;dGzbqC*0juPsFqTzt6CP$RmIL}Xj)R)R4r*Pi{i|jx`xV@Xa(nJ zlc2J)J}jkq%=qyW#+$=Al~vNGgew{=?&s-#DjlRTGh49q%|4AWx3XnkO;a$xv1V>& zVdVk|IV0V;c5zL0re$_rv{>aS+D;jmMw%`Y>O{IscpUnkTT`EDXl$unD1BbO17C-h z)geh?vuj(L$27|58dIp-yryAxQ)_*n_Ls=#SE+6-*_vOqu(Gy3>GHQ;#aea#J{+* zu2#BsO{Tf3skTwNM@?N#Rf`-+A(BP;F2CqC2WklGe%#vFr|q<(pi#O*XwzKNA{sJC z#8`6C(4+^+d>JJ&RfPEt-3qF#t`6H7%_w=3SxiQY6x}Q-ug=u9%G6R>UsaP?)LL2J zf__w;shZc+;GdD2D05>pW_;>^qCj;AkDj2aovG}reBfBE?9zpyvUrXZE4~j*8Q*OqC`l$%rNO@8BvQub+ejA!bP%LmKW)1#+HubaB!)DYwKl=!UP^HT&9Z} zGj75G2L{axY8!DrT%(1yTBe#?6>P4{*W_GFQ$w9vE$3Iqufa{;*AkkD-b89GNfKw4-(Nqeer`)O~I@D)X zB4reg4^?C)mHoRK^zwF^#zxsbR4!HG*( zEuIu3`Hu8hR|&_3i>+Nav%7jij`d1_(%6Xc{A!hJccBW&K%Ft`QeoKceWd}^AS!X3Nb&B-3HQkGfW zNyAea*;%W-^ukK%6F80b;i1;6St_qany)t2bLzs~WeCF+B4i~TX|VaVRw0C1K|v^l z8=gW@t&+|ryR&d2s;#fCQI~fz-RT{XEVRzyxFEEY6XVoGkg1j{AnCbs-Pur;nbVwE z($KV^xv^4Ki0E#+P`eB2YnJGeq_;L^$VR#sDHakfV|Jxyw=~r*HL<9Y5lQKB zN9q|$wov0`(g;0`m5NI52se;)t(P#J)jGMxY>7rZ)(LeiDi8^kRHUAT;Wl<`BpTKE z#%Agp7+q_l%qlgq*;+cLwz;WtOiBusU1_blK$F_Zwz)Bw-`Y}J7j9W(J=IrSa)CWN ze7jYqwgI_rmg|!`nSi8=$@J7vmuaqRP&;S2?2Q~Z)hue2nIf~ewnFA4GF8#uuLDQ!IGJ&*xt-?eXE|txS zirozRuzM>;FWqXBrfwu@t;j0Y9F0=%V`O>^$7)Pkx!;vrOtOx~D1@<%U5ZTN2)T}4 zyrR@_$uJWjT0gWZ9KRIX9Mw(GBoeHuQlC{7p0K=!Wx!A6>;}0v6I!rI7wL=fKrX)2 z9@M6D{L&)$R*e~Hy(*aiYwM#uPBur2<^EEuT*=AhanuFs8OA@JIpBUNYzM8bY7|cW zkqZJ2*|t^R2wvzLh z?uwpduSFux3T04XRE6~z%Q2?=r)u9YU3wGf%?hE-I5uEt6HbRV+Cs^>%o(8*hAO>H zZ7Fpa;odh~e6&(^xI6CC7sKJ8s*Y$wXW@p;9aU&$&b@L^2HPE6UZFBI3mcl`3Rd<= zwt@6m3|)(rI~-I9da-6D0?Bt(xC=a7qD1muBMgB#d4cX&v`nnefP+SM|Yt< z{ccWUlkBwS#FSRmAa_@=x2tx>%~9cI>?rn-`DQ?8B6sy=bquqhtEW9_Mt3l`--N?7 zra;}qvZ0pEZ)EKXefL>`&^qdNnwO-o0c&ONu|$W^$4~}bSO~W_W}Jo{FJh%`#)Y$c zj1x>YYI>5=>uOuDmh0-fmDR&iE&AG37+>MIrG?`H)n^;3`nJfNId!eg^ZIgO0yrz+ z7N_oZYKqePE`1z!ahXZ5=;bOX#ms&A>=A7-GbEw`#m zpXoyf&pA7EZ^o`Z7Y2ZiMIb_&D0! z-O>IU8s(P#?8>SI>VmjgK2pGjB3uocDwpURM4^MKhDP~3L~iia%BYCme-6)vp{Qlc z2BJUHu*Va)0YG0=8$n6QTy3K35@rp}fq59?%ZvwgkIWr&nD)(lWedfs8M@@vC8nOR zWzCAL%Qu@o-D=of$Q^R2yS@xopF~C1#-gQIqC$6O=~H7)wRdHBIT#MT%!!LLrTFad zs5-g2VP^=7j$|uLesuJxE*~zJYHkhBI^8Ms@c*@C#y9|iFckGn#K8*~6DMy#(CFe| zf{XF=_Wz<#!$>I5l(xJUXEgZ;GR?W>tmRb{#g!Q5A|UBTLsTSyydibNC=KEw`PR9Y zCY&XU?EK5iPSZkd-cN2m$3|+4aq0)(Nu5{9Ivtr@S@@h%&-(;nSDn;%isa5aEtdSF zOEVtNR41@ukh}&6M5S#T%KPOCAUBq9)@(xVQ0HFb;kOX+jUtKL%JA4!cV*mp0M6uW ARsaA1 literal 0 HcmV?d00001 diff --git a/jpeg-8c/Makefile b/jpeg-8c/Makefile new file mode 100644 index 00000000..c249ab51 --- /dev/null +++ b/jpeg-8c/Makefile @@ -0,0 +1,1092 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + +# +# Automake Makefile for the JPEG library +# +# This file is written by Bob Friesenhahn, Guido Vollbeding +# + + + + +pkgdatadir = $(datadir)/libjpeg +pkgincludedir = $(includedir)/libjpeg +pkglibdir = $(libdir)/libjpeg +pkglibexecdir = $(libexecdir)/libjpeg +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-unknown-linux-gnu +host_triplet = x86_64-unknown-linux-gnu +target_triplet = x86_64-unknown-linux-gnu +ANSI2KNR = +am__append_1 = -Wl,--version-script=$(srcdir)/libjpeg.map +bin_PROGRAMS = cjpeg$(EXEEXT) djpeg$(EXEEXT) jpegtran$(EXEEXT) \ + rdjpgcom$(EXEEXT) wrjpgcom$(EXEEXT) +subdir = . +DIST_COMMON = README $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/configure $(am__configure_deps) \ + $(srcdir)/jconfig.cfg ansi2knr.c ansi2knr.1 depcomp \ + $(include_HEADERS) $(noinst_HEADERS) +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = jconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(includedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libjpeg_la_LIBADD = +am__objects_1 = jaricom$U.lo jcapimin$U.lo jcapistd$U.lo jcarith$U.lo \ + jccoefct$U.lo jccolor$U.lo jcdctmgr$U.lo jchuff$U.lo \ + jcinit$U.lo jcmainct$U.lo jcmarker$U.lo jcmaster$U.lo \ + jcomapi$U.lo jcparam$U.lo jcprepct$U.lo jcsample$U.lo \ + jctrans$U.lo jdapimin$U.lo jdapistd$U.lo jdarith$U.lo \ + jdatadst$U.lo jdatasrc$U.lo jdcoefct$U.lo jdcolor$U.lo \ + jddctmgr$U.lo jdhuff$U.lo jdinput$U.lo jdmainct$U.lo \ + jdmarker$U.lo jdmaster$U.lo jdmerge$U.lo jdpostct$U.lo \ + jdsample$U.lo jdtrans$U.lo jerror$U.lo jfdctflt$U.lo \ + jfdctfst$U.lo jfdctint$U.lo jidctflt$U.lo jidctfst$U.lo \ + jidctint$U.lo jquant1$U.lo jquant2$U.lo jutils$U.lo \ + jmemmgr$U.lo jmemnobs$U.lo +am_libjpeg_la_OBJECTS = $(am__objects_1) +libjpeg_la_OBJECTS = $(am_libjpeg_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libjpeg_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libjpeg_la_LDFLAGS) $(LDFLAGS) -o $@ +PROGRAMS = $(bin_PROGRAMS) +am_cjpeg_OBJECTS = cjpeg$U.$(OBJEXT) rdppm$U.$(OBJEXT) \ + rdgif$U.$(OBJEXT) rdtarga$U.$(OBJEXT) rdrle$U.$(OBJEXT) \ + rdbmp$U.$(OBJEXT) rdswitch$U.$(OBJEXT) cdjpeg$U.$(OBJEXT) +cjpeg_OBJECTS = $(am_cjpeg_OBJECTS) +cjpeg_DEPENDENCIES = libjpeg.la +am_djpeg_OBJECTS = djpeg$U.$(OBJEXT) wrppm$U.$(OBJEXT) \ + wrgif$U.$(OBJEXT) wrtarga$U.$(OBJEXT) wrrle$U.$(OBJEXT) \ + wrbmp$U.$(OBJEXT) rdcolmap$U.$(OBJEXT) cdjpeg$U.$(OBJEXT) +djpeg_OBJECTS = $(am_djpeg_OBJECTS) +djpeg_DEPENDENCIES = libjpeg.la +am_jpegtran_OBJECTS = jpegtran$U.$(OBJEXT) rdswitch$U.$(OBJEXT) \ + cdjpeg$U.$(OBJEXT) transupp$U.$(OBJEXT) +jpegtran_OBJECTS = $(am_jpegtran_OBJECTS) +jpegtran_DEPENDENCIES = libjpeg.la +am_rdjpgcom_OBJECTS = rdjpgcom$U.$(OBJEXT) +rdjpgcom_OBJECTS = $(am_rdjpgcom_OBJECTS) +rdjpgcom_LDADD = $(LDADD) +am_wrjpgcom_OBJECTS = wrjpgcom$U.$(OBJEXT) +wrjpgcom_OBJECTS = $(am_wrjpgcom_OBJECTS) +wrjpgcom_LDADD = $(LDADD) +DEFAULT_INCLUDES = -I. +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libjpeg_la_SOURCES) $(cjpeg_SOURCES) $(djpeg_SOURCES) \ + $(jpegtran_SOURCES) $(rdjpgcom_SOURCES) $(wrjpgcom_SOURCES) +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +HEADERS = $(include_HEADERS) $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +ACLOCAL = ${SHELL} /home/www/proj/jpeg-8c/missing --run aclocal-1.11 +AMTAR = ${SHELL} /home/www/proj/jpeg-8c/missing --run tar +AM_DEFAULT_VERBOSITY = 0 +AR = ar +AS = as +AUTOCONF = ${SHELL} /home/www/proj/jpeg-8c/missing --run autoconf +AUTOHEADER = echo autoheader ignored +AUTOMAKE = ${SHELL} /home/www/proj/jpeg-8c/missing --run automake-1.11 +AWK = mawk +CC = gcc -std=gnu99 +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 +CPP = gcc -E +CPPFLAGS = +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = dlltool +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /bin/grep -E +EXEEXT = +FGREP = /bin/grep -F +GREP = /bin/grep +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +JPEG_LIB_VERSION = 11:0:3 +LD = /usr/bin/ld -m elf_x86_64 +LDFLAGS = +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = +LN_S = ln -s +LTLIBOBJS = +MAINT = # +MAKEINFO = ${SHELL} /home/www/proj/jpeg-8c/missing --run makeinfo +MANIFEST_TOOL = : +MEMORYMGR = jmemnobs +MKDIR_P = /bin/mkdir -p +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OTOOL = +OTOOL64 = +PACKAGE = libjpeg +PACKAGE_BUGREPORT = +PACKAGE_NAME = libjpeg +PACKAGE_STRING = libjpeg 8.3.0 +PACKAGE_TARNAME = libjpeg +PACKAGE_URL = +PACKAGE_VERSION = 8.3.0 +PATH_SEPARATOR = : +RANLIB = ranlib +SED = /bin/sed +SET_MAKE = +SHELL = /bin/bash +STRIP = strip +U = +VERSION = 8.3.0 +abs_builddir = /home/www/proj/jpeg-8c +abs_srcdir = /home/www/proj/jpeg-8c +abs_top_builddir = /home/www/proj/jpeg-8c +abs_top_srcdir = /home/www/proj/jpeg-8c +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = ${AMTAR} chof - "$$tardir" +am__untar = ${AMTAR} xf - +bindir = ${exec_prefix}/bin +build = x86_64-unknown-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = unknown +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-unknown-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = unknown +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /home/www/proj/jpeg-8c/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = /bin/mkdir -p +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = . +sysconfdir = ${prefix}/etc +target = x86_64-unknown-linux-gnu +target_alias = +target_cpu = x86_64 +target_os = linux-gnu +target_vendor = unknown +top_build_prefix = +top_builddir = . +top_srcdir = . + +# Sources to build library +LIBSOURCES = jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \ + jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \ + jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \ + jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \ + jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \ + jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \ + jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \ + jquant2.c jutils.c jmemmgr.c jmemnobs.c + + +# System dependent sources +SYSDEPSOURCES = jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c + +# Headers which are installed to support the library +INSTINCLUDES = jerror.h jmorecfg.h jpeglib.h + +# Headers which are not installed +OTHERINCLUDES = cderror.h cdjpeg.h jdct.h jinclude.h jmemsys.h jpegint.h \ + jversion.h transupp.h + + +# Manual pages (Automake uses 'MANS' for itself) +DISTMANS = cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 wrjpgcom.1 + +# Other documentation files +DOCS = README install.txt usage.txt wizard.txt example.c libjpeg.txt \ + structure.txt coderules.txt filelist.txt change.log + + +# Makefiles for various systems +MKFILES = configure Makefile.in makefile.ansi makefile.unix makefile.bcc \ + makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \ + makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ + makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ + maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ + makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \ + makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \ + makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \ + makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \ + makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \ + makefile.mms makefile.vms makvms.opt + + +# Configuration files +CONFIGFILES = jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ + jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ + jconfig.vms + + +# Support scripts for configure +CONFIGUREFILES = config.guess config.sub install-sh ltmain.sh depcomp missing + +# Miscellaneous support files +OTHERFILES = jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \ + libjpeg.map + + +# Test support files +TESTFILES = testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \ + testimgp.jpg + + +# libtool libraries to build +lib_LTLIBRARIES = libjpeg.la + +# Library sources for libjpeg.la +libjpeg_la_SOURCES = $(LIBSOURCES) + +# LDFLAGS for libjpeg.la +libjpeg_la_LDFLAGS = -no-undefined -version-info $(JPEG_LIB_VERSION) \ + $(am__append_1) + +# Executable sources & libs +cjpeg_SOURCES = cjpeg.c rdppm.c rdgif.c rdtarga.c rdrle.c rdbmp.c \ + rdswitch.c cdjpeg.c + +cjpeg_LDADD = libjpeg.la +djpeg_SOURCES = djpeg.c wrppm.c wrgif.c wrtarga.c wrrle.c wrbmp.c \ + rdcolmap.c cdjpeg.c + +djpeg_LDADD = libjpeg.la +jpegtran_SOURCES = jpegtran.c rdswitch.c cdjpeg.c transupp.c +jpegtran_LDADD = libjpeg.la +rdjpgcom_SOURCES = rdjpgcom.c +wrjpgcom_SOURCES = wrjpgcom.c + +# Manual pages to install +man_MANS = $(DISTMANS) + +# Headers to install +include_HEADERS = $(INSTINCLUDES) + +# Other distributed headers +noinst_HEADERS = $(OTHERINCLUDES) + +# Other distributed files +EXTRA_DIST = $(DOCS) $(DISTMANS) $(MKFILES) $(CONFIGFILES) $(SYSDEPSOURCES) \ + $(OTHERFILES) $(TESTFILES) + + +# Files to be cleaned +CLEANFILES = testout.ppm testout.bmp testout.jpg testoutp.ppm testoutp.jpg \ + testoutt.jpg + +all: jconfig.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +am--refresh: + @: +$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: # $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): # $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +jconfig.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/jconfig.cfg $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status jconfig.h +$(srcdir)/jconfig.cfg: # $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f jconfig.h stamp-h1 +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libjpeg.la: $(libjpeg_la_OBJECTS) $(libjpeg_la_DEPENDENCIES) + $(AM_V_CCLD)$(libjpeg_la_LINK) -rpath $(libdir) $(libjpeg_la_OBJECTS) $(libjpeg_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +cjpeg$(EXEEXT): $(cjpeg_OBJECTS) $(cjpeg_DEPENDENCIES) + @rm -f cjpeg$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(cjpeg_OBJECTS) $(cjpeg_LDADD) $(LIBS) +djpeg$(EXEEXT): $(djpeg_OBJECTS) $(djpeg_DEPENDENCIES) + @rm -f djpeg$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(djpeg_OBJECTS) $(djpeg_LDADD) $(LIBS) +jpegtran$(EXEEXT): $(jpegtran_OBJECTS) $(jpegtran_DEPENDENCIES) + @rm -f jpegtran$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(jpegtran_OBJECTS) $(jpegtran_LDADD) $(LIBS) +rdjpgcom$(EXEEXT): $(rdjpgcom_OBJECTS) $(rdjpgcom_DEPENDENCIES) + @rm -f rdjpgcom$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(rdjpgcom_OBJECTS) $(rdjpgcom_LDADD) $(LIBS) +wrjpgcom$(EXEEXT): $(wrjpgcom_OBJECTS) $(wrjpgcom_DEPENDENCIES) + @rm -f wrjpgcom$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(wrjpgcom_OBJECTS) $(wrjpgcom_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c +./ansi2knr: ansi2knr.$(OBJEXT) + $(LINK) ansi2knr.$(OBJEXT) $(LIBS) +ansi2knr.$(OBJEXT): $(CONFIG_HEADER) + +clean-krextra: + -rm -f ansi2knr + +mostlyclean-kr: + -test "$U" = "" || rm -f *_.c + +include ./$(DEPDIR)/jmemnobs$U.Plo +include ./$(DEPDIR)/cdjpeg$U.Po +include ./$(DEPDIR)/cjpeg$U.Po +include ./$(DEPDIR)/djpeg$U.Po +include ./$(DEPDIR)/jaricom$U.Plo +include ./$(DEPDIR)/jcapimin$U.Plo +include ./$(DEPDIR)/jcapistd$U.Plo +include ./$(DEPDIR)/jcarith$U.Plo +include ./$(DEPDIR)/jccoefct$U.Plo +include ./$(DEPDIR)/jccolor$U.Plo +include ./$(DEPDIR)/jcdctmgr$U.Plo +include ./$(DEPDIR)/jchuff$U.Plo +include ./$(DEPDIR)/jcinit$U.Plo +include ./$(DEPDIR)/jcmainct$U.Plo +include ./$(DEPDIR)/jcmarker$U.Plo +include ./$(DEPDIR)/jcmaster$U.Plo +include ./$(DEPDIR)/jcomapi$U.Plo +include ./$(DEPDIR)/jcparam$U.Plo +include ./$(DEPDIR)/jcprepct$U.Plo +include ./$(DEPDIR)/jcsample$U.Plo +include ./$(DEPDIR)/jctrans$U.Plo +include ./$(DEPDIR)/jdapimin$U.Plo +include ./$(DEPDIR)/jdapistd$U.Plo +include ./$(DEPDIR)/jdarith$U.Plo +include ./$(DEPDIR)/jdatadst$U.Plo +include ./$(DEPDIR)/jdatasrc$U.Plo +include ./$(DEPDIR)/jdcoefct$U.Plo +include ./$(DEPDIR)/jdcolor$U.Plo +include ./$(DEPDIR)/jddctmgr$U.Plo +include ./$(DEPDIR)/jdhuff$U.Plo +include ./$(DEPDIR)/jdinput$U.Plo +include ./$(DEPDIR)/jdmainct$U.Plo +include ./$(DEPDIR)/jdmarker$U.Plo +include ./$(DEPDIR)/jdmaster$U.Plo +include ./$(DEPDIR)/jdmerge$U.Plo +include ./$(DEPDIR)/jdpostct$U.Plo +include ./$(DEPDIR)/jdsample$U.Plo +include ./$(DEPDIR)/jdtrans$U.Plo +include ./$(DEPDIR)/jerror$U.Plo +include ./$(DEPDIR)/jfdctflt$U.Plo +include ./$(DEPDIR)/jfdctfst$U.Plo +include ./$(DEPDIR)/jfdctint$U.Plo +include ./$(DEPDIR)/jidctflt$U.Plo +include ./$(DEPDIR)/jidctfst$U.Plo +include ./$(DEPDIR)/jidctint$U.Plo +include ./$(DEPDIR)/jmemmgr$U.Plo +include ./$(DEPDIR)/jpegtran$U.Po +include ./$(DEPDIR)/jquant1$U.Plo +include ./$(DEPDIR)/jquant2$U.Plo +include ./$(DEPDIR)/jutils$U.Plo +include ./$(DEPDIR)/rdbmp$U.Po +include ./$(DEPDIR)/rdcolmap$U.Po +include ./$(DEPDIR)/rdgif$U.Po +include ./$(DEPDIR)/rdjpgcom$U.Po +include ./$(DEPDIR)/rdppm$U.Po +include ./$(DEPDIR)/rdrle$U.Po +include ./$(DEPDIR)/rdswitch$U.Po +include ./$(DEPDIR)/rdtarga$U.Po +include ./$(DEPDIR)/transupp$U.Po +include ./$(DEPDIR)/wrbmp$U.Po +include ./$(DEPDIR)/wrgif$U.Po +include ./$(DEPDIR)/wrjpgcom$U.Po +include ./$(DEPDIR)/wrppm$U.Po +include ./$(DEPDIR)/wrrle$U.Po +include ./$(DEPDIR)/wrtarga$U.Po + +.c.o: + $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CC) \ +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c $< + +.c.obj: + $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CC) \ +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: + $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +# $(AM_V_CC) \ +# source='$<' object='$@' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LTCOMPILE) -c -o $@ $< +jmemnobs_.c: jmemnobs.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jmemnobs.c; then echo $(srcdir)/jmemnobs.c; else echo jmemnobs.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +cdjpeg_.c: cdjpeg.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/cdjpeg.c; then echo $(srcdir)/cdjpeg.c; else echo cdjpeg.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +cjpeg_.c: cjpeg.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/cjpeg.c; then echo $(srcdir)/cjpeg.c; else echo cjpeg.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +djpeg_.c: djpeg.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/djpeg.c; then echo $(srcdir)/djpeg.c; else echo djpeg.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jaricom_.c: jaricom.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jaricom.c; then echo $(srcdir)/jaricom.c; else echo jaricom.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcapimin_.c: jcapimin.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcapimin.c; then echo $(srcdir)/jcapimin.c; else echo jcapimin.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcapistd_.c: jcapistd.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcapistd.c; then echo $(srcdir)/jcapistd.c; else echo jcapistd.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcarith_.c: jcarith.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcarith.c; then echo $(srcdir)/jcarith.c; else echo jcarith.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jccoefct_.c: jccoefct.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jccoefct.c; then echo $(srcdir)/jccoefct.c; else echo jccoefct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jccolor_.c: jccolor.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jccolor.c; then echo $(srcdir)/jccolor.c; else echo jccolor.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcdctmgr_.c: jcdctmgr.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcdctmgr.c; then echo $(srcdir)/jcdctmgr.c; else echo jcdctmgr.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jchuff_.c: jchuff.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jchuff.c; then echo $(srcdir)/jchuff.c; else echo jchuff.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcinit_.c: jcinit.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcinit.c; then echo $(srcdir)/jcinit.c; else echo jcinit.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcmainct_.c: jcmainct.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcmainct.c; then echo $(srcdir)/jcmainct.c; else echo jcmainct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcmarker_.c: jcmarker.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcmarker.c; then echo $(srcdir)/jcmarker.c; else echo jcmarker.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcmaster_.c: jcmaster.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcmaster.c; then echo $(srcdir)/jcmaster.c; else echo jcmaster.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcomapi_.c: jcomapi.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcomapi.c; then echo $(srcdir)/jcomapi.c; else echo jcomapi.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcparam_.c: jcparam.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcparam.c; then echo $(srcdir)/jcparam.c; else echo jcparam.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcprepct_.c: jcprepct.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcprepct.c; then echo $(srcdir)/jcprepct.c; else echo jcprepct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcsample_.c: jcsample.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcsample.c; then echo $(srcdir)/jcsample.c; else echo jcsample.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jctrans_.c: jctrans.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jctrans.c; then echo $(srcdir)/jctrans.c; else echo jctrans.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdapimin_.c: jdapimin.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdapimin.c; then echo $(srcdir)/jdapimin.c; else echo jdapimin.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdapistd_.c: jdapistd.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdapistd.c; then echo $(srcdir)/jdapistd.c; else echo jdapistd.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdarith_.c: jdarith.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdarith.c; then echo $(srcdir)/jdarith.c; else echo jdarith.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdatadst_.c: jdatadst.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdatadst.c; then echo $(srcdir)/jdatadst.c; else echo jdatadst.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdatasrc_.c: jdatasrc.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdatasrc.c; then echo $(srcdir)/jdatasrc.c; else echo jdatasrc.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdcoefct_.c: jdcoefct.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdcoefct.c; then echo $(srcdir)/jdcoefct.c; else echo jdcoefct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdcolor_.c: jdcolor.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdcolor.c; then echo $(srcdir)/jdcolor.c; else echo jdcolor.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jddctmgr_.c: jddctmgr.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jddctmgr.c; then echo $(srcdir)/jddctmgr.c; else echo jddctmgr.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdhuff_.c: jdhuff.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdhuff.c; then echo $(srcdir)/jdhuff.c; else echo jdhuff.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdinput_.c: jdinput.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdinput.c; then echo $(srcdir)/jdinput.c; else echo jdinput.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdmainct_.c: jdmainct.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdmainct.c; then echo $(srcdir)/jdmainct.c; else echo jdmainct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdmarker_.c: jdmarker.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdmarker.c; then echo $(srcdir)/jdmarker.c; else echo jdmarker.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdmaster_.c: jdmaster.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdmaster.c; then echo $(srcdir)/jdmaster.c; else echo jdmaster.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdmerge_.c: jdmerge.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdmerge.c; then echo $(srcdir)/jdmerge.c; else echo jdmerge.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdpostct_.c: jdpostct.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdpostct.c; then echo $(srcdir)/jdpostct.c; else echo jdpostct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdsample_.c: jdsample.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdsample.c; then echo $(srcdir)/jdsample.c; else echo jdsample.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdtrans_.c: jdtrans.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdtrans.c; then echo $(srcdir)/jdtrans.c; else echo jdtrans.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jerror_.c: jerror.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jerror.c; then echo $(srcdir)/jerror.c; else echo jerror.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jfdctflt_.c: jfdctflt.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jfdctflt.c; then echo $(srcdir)/jfdctflt.c; else echo jfdctflt.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jfdctfst_.c: jfdctfst.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jfdctfst.c; then echo $(srcdir)/jfdctfst.c; else echo jfdctfst.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jfdctint_.c: jfdctint.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jfdctint.c; then echo $(srcdir)/jfdctint.c; else echo jfdctint.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jidctflt_.c: jidctflt.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jidctflt.c; then echo $(srcdir)/jidctflt.c; else echo jidctflt.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jidctfst_.c: jidctfst.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jidctfst.c; then echo $(srcdir)/jidctfst.c; else echo jidctfst.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jidctint_.c: jidctint.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jidctint.c; then echo $(srcdir)/jidctint.c; else echo jidctint.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jmemmgr_.c: jmemmgr.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jmemmgr.c; then echo $(srcdir)/jmemmgr.c; else echo jmemmgr.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jpegtran_.c: jpegtran.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jpegtran.c; then echo $(srcdir)/jpegtran.c; else echo jpegtran.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jquant1_.c: jquant1.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jquant1.c; then echo $(srcdir)/jquant1.c; else echo jquant1.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jquant2_.c: jquant2.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jquant2.c; then echo $(srcdir)/jquant2.c; else echo jquant2.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jutils_.c: jutils.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jutils.c; then echo $(srcdir)/jutils.c; else echo jutils.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdbmp_.c: rdbmp.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdbmp.c; then echo $(srcdir)/rdbmp.c; else echo rdbmp.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdcolmap_.c: rdcolmap.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdcolmap.c; then echo $(srcdir)/rdcolmap.c; else echo rdcolmap.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdgif_.c: rdgif.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdgif.c; then echo $(srcdir)/rdgif.c; else echo rdgif.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdjpgcom_.c: rdjpgcom.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdjpgcom.c; then echo $(srcdir)/rdjpgcom.c; else echo rdjpgcom.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdppm_.c: rdppm.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdppm.c; then echo $(srcdir)/rdppm.c; else echo rdppm.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdrle_.c: rdrle.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdrle.c; then echo $(srcdir)/rdrle.c; else echo rdrle.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdswitch_.c: rdswitch.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdswitch.c; then echo $(srcdir)/rdswitch.c; else echo rdswitch.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdtarga_.c: rdtarga.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdtarga.c; then echo $(srcdir)/rdtarga.c; else echo rdtarga.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +transupp_.c: transupp.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/transupp.c; then echo $(srcdir)/transupp.c; else echo transupp.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +wrbmp_.c: wrbmp.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrbmp.c; then echo $(srcdir)/wrbmp.c; else echo wrbmp.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +wrgif_.c: wrgif.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrgif.c; then echo $(srcdir)/wrgif.c; else echo wrgif.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +wrjpgcom_.c: wrjpgcom.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrjpgcom.c; then echo $(srcdir)/wrjpgcom.c; else echo wrjpgcom.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +wrppm_.c: wrppm.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrppm.c; then echo $(srcdir)/wrppm.c; else echo wrppm.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +wrrle_.c: wrrle.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrrle.c; then echo $(srcdir)/wrrle.c; else echo wrrle.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +wrtarga_.c: wrtarga.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrtarga.c; then echo $(srcdir)/wrtarga.c; else echo wrtarga.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jmemnobs_.$(OBJEXT) jmemnobs_.lo cdjpeg_.$(OBJEXT) cdjpeg_.lo \ +cjpeg_.$(OBJEXT) cjpeg_.lo djpeg_.$(OBJEXT) djpeg_.lo \ +jaricom_.$(OBJEXT) jaricom_.lo jcapimin_.$(OBJEXT) jcapimin_.lo \ +jcapistd_.$(OBJEXT) jcapistd_.lo jcarith_.$(OBJEXT) jcarith_.lo \ +jccoefct_.$(OBJEXT) jccoefct_.lo jccolor_.$(OBJEXT) jccolor_.lo \ +jcdctmgr_.$(OBJEXT) jcdctmgr_.lo jchuff_.$(OBJEXT) jchuff_.lo \ +jcinit_.$(OBJEXT) jcinit_.lo jcmainct_.$(OBJEXT) jcmainct_.lo \ +jcmarker_.$(OBJEXT) jcmarker_.lo jcmaster_.$(OBJEXT) jcmaster_.lo \ +jcomapi_.$(OBJEXT) jcomapi_.lo jcparam_.$(OBJEXT) jcparam_.lo \ +jcprepct_.$(OBJEXT) jcprepct_.lo jcsample_.$(OBJEXT) jcsample_.lo \ +jctrans_.$(OBJEXT) jctrans_.lo jdapimin_.$(OBJEXT) jdapimin_.lo \ +jdapistd_.$(OBJEXT) jdapistd_.lo jdarith_.$(OBJEXT) jdarith_.lo \ +jdatadst_.$(OBJEXT) jdatadst_.lo jdatasrc_.$(OBJEXT) jdatasrc_.lo \ +jdcoefct_.$(OBJEXT) jdcoefct_.lo jdcolor_.$(OBJEXT) jdcolor_.lo \ +jddctmgr_.$(OBJEXT) jddctmgr_.lo jdhuff_.$(OBJEXT) jdhuff_.lo \ +jdinput_.$(OBJEXT) jdinput_.lo jdmainct_.$(OBJEXT) jdmainct_.lo \ +jdmarker_.$(OBJEXT) jdmarker_.lo jdmaster_.$(OBJEXT) jdmaster_.lo \ +jdmerge_.$(OBJEXT) jdmerge_.lo jdpostct_.$(OBJEXT) jdpostct_.lo \ +jdsample_.$(OBJEXT) jdsample_.lo jdtrans_.$(OBJEXT) jdtrans_.lo \ +jerror_.$(OBJEXT) jerror_.lo jfdctflt_.$(OBJEXT) jfdctflt_.lo \ +jfdctfst_.$(OBJEXT) jfdctfst_.lo jfdctint_.$(OBJEXT) jfdctint_.lo \ +jidctflt_.$(OBJEXT) jidctflt_.lo jidctfst_.$(OBJEXT) jidctfst_.lo \ +jidctint_.$(OBJEXT) jidctint_.lo jmemmgr_.$(OBJEXT) jmemmgr_.lo \ +jpegtran_.$(OBJEXT) jpegtran_.lo jquant1_.$(OBJEXT) jquant1_.lo \ +jquant2_.$(OBJEXT) jquant2_.lo jutils_.$(OBJEXT) jutils_.lo \ +rdbmp_.$(OBJEXT) rdbmp_.lo rdcolmap_.$(OBJEXT) rdcolmap_.lo \ +rdgif_.$(OBJEXT) rdgif_.lo rdjpgcom_.$(OBJEXT) rdjpgcom_.lo \ +rdppm_.$(OBJEXT) rdppm_.lo rdrle_.$(OBJEXT) rdrle_.lo \ +rdswitch_.$(OBJEXT) rdswitch_.lo rdtarga_.$(OBJEXT) rdtarga_.lo \ +transupp_.$(OBJEXT) transupp_.lo wrbmp_.$(OBJEXT) wrbmp_.lo \ +wrgif_.$(OBJEXT) wrgif_.lo wrjpgcom_.$(OBJEXT) wrjpgcom_.lo \ +wrppm_.$(OBJEXT) wrppm_.lo wrrle_.$(OBJEXT) wrrle_.lo \ +wrtarga_.$(OBJEXT) wrtarga_.lo : $(ANSI2KNR) + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(includedir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) jconfig.cfg $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) jconfig.cfg $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) jconfig.cfg $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) jconfig.cfg $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(ANSI2KNR) $(LTLIBRARIES) $(PROGRAMS) $(MANS) \ + $(HEADERS) jconfig.h +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-krextra \ + clean-libLTLIBRARIES clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local install-includeHEADERS install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic mostlyclean-kr \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ + uninstall-libLTLIBRARIES uninstall-local uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: all check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am am--refresh check check-am check-local \ + clean clean-binPROGRAMS clean-generic clean-krextra \ + clean-libLTLIBRARIES clean-libtool ctags distclean \ + distclean-compile distclean-generic distclean-hdr \ + distclean-libtool distclean-tags dvi dvi-am html html-am info \ + info-am install install-am install-binPROGRAMS install-data \ + install-data-am install-data-local install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-includeHEADERS install-info install-info-am \ + install-libLTLIBRARIES install-man install-man1 install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-kr mostlyclean-libtool pdf \ + pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-includeHEADERS \ + uninstall-libLTLIBRARIES uninstall-local uninstall-man \ + uninstall-man1 + + +# Install jconfig.h +install-data-local: + $(mkinstalldirs) $(DESTDIR)$(includedir) + $(INSTALL_HEADER) jconfig.h $(DESTDIR)$(includedir)/jconfig.h + +# Uninstall jconfig.h +uninstall-local: + rm -f $(DESTDIR)$(includedir)/jconfig.h + +# Run tests +test: check-local +check-local: + rm -f testout* + ./djpeg -dct int -ppm -outfile testout.ppm $(srcdir)/testorig.jpg + ./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testorig.jpg + ./cjpeg -dct int -outfile testout.jpg $(srcdir)/testimg.ppm + ./djpeg -dct int -ppm -outfile testoutp.ppm $(srcdir)/testprog.jpg + ./cjpeg -dct int -progressive -opt -outfile testoutp.jpg $(srcdir)/testimg.ppm + ./jpegtran -outfile testoutt.jpg $(srcdir)/testprog.jpg + cmp $(srcdir)/testimg.ppm testout.ppm + cmp $(srcdir)/testimg.bmp testout.bmp + cmp $(srcdir)/testimg.jpg testout.jpg + cmp $(srcdir)/testimg.ppm testoutp.ppm + cmp $(srcdir)/testimgp.jpg testoutp.jpg + cmp $(srcdir)/testorig.jpg testoutt.jpg + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/jpeg-8c/Makefile.am b/jpeg-8c/Makefile.am new file mode 100644 index 00000000..42cff57f --- /dev/null +++ b/jpeg-8c/Makefile.am @@ -0,0 +1,134 @@ +## Process this file with automake to produce Makefile.in +# +# Automake Makefile for the JPEG library +# +# This file is written by Bob Friesenhahn, Guido Vollbeding +# + +# Sources to build library +LIBSOURCES = jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \ + jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \ + jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \ + jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \ + jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \ + jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \ + jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \ + jquant2.c jutils.c jmemmgr.c @MEMORYMGR@.c + +# System dependent sources +SYSDEPSOURCES = jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c + +# Headers which are installed to support the library +INSTINCLUDES = jerror.h jmorecfg.h jpeglib.h + +# Headers which are not installed +OTHERINCLUDES = cderror.h cdjpeg.h jdct.h jinclude.h jmemsys.h jpegint.h \ + jversion.h transupp.h + +# Manual pages (Automake uses 'MANS' for itself) +DISTMANS= cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 wrjpgcom.1 + +# Other documentation files +DOCS= README install.txt usage.txt wizard.txt example.c libjpeg.txt \ + structure.txt coderules.txt filelist.txt change.log + +# Makefiles for various systems +MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \ + makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \ + makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ + makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ + maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ + makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \ + makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \ + makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \ + makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \ + makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \ + makefile.mms makefile.vms makvms.opt + +# Configuration files +CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ + jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ + jconfig.vms + +# Support scripts for configure +CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing + +# Miscellaneous support files +OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \ + libjpeg.map + +# Test support files +TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \ + testimgp.jpg + +# libtool libraries to build +lib_LTLIBRARIES = libjpeg.la + +# Library sources for libjpeg.la +libjpeg_la_SOURCES = $(LIBSOURCES) + +# LDFLAGS for libjpeg.la +libjpeg_la_LDFLAGS = -no-undefined \ + -version-info $(JPEG_LIB_VERSION) + +if HAVE_LD_VERSION_SCRIPT + libjpeg_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libjpeg.map +endif + +# Executables to build +bin_PROGRAMS = cjpeg djpeg jpegtran rdjpgcom wrjpgcom + +# Executable sources & libs +cjpeg_SOURCES = cjpeg.c rdppm.c rdgif.c rdtarga.c rdrle.c rdbmp.c \ + rdswitch.c cdjpeg.c +cjpeg_LDADD = libjpeg.la +djpeg_SOURCES = djpeg.c wrppm.c wrgif.c wrtarga.c wrrle.c wrbmp.c \ + rdcolmap.c cdjpeg.c +djpeg_LDADD = libjpeg.la +jpegtran_SOURCES = jpegtran.c rdswitch.c cdjpeg.c transupp.c +jpegtran_LDADD = libjpeg.la +rdjpgcom_SOURCES = rdjpgcom.c +wrjpgcom_SOURCES = wrjpgcom.c + +# Manual pages to install +man_MANS = $(DISTMANS) + +# Headers to install +include_HEADERS = $(INSTINCLUDES) + +# Other distributed headers +noinst_HEADERS = $(OTHERINCLUDES) + +# Other distributed files +EXTRA_DIST = $(DOCS) $(DISTMANS) $(MKFILES) $(CONFIGFILES) $(SYSDEPSOURCES) \ + $(OTHERFILES) $(TESTFILES) + +# Files to be cleaned +CLEANFILES = testout.ppm testout.bmp testout.jpg testoutp.ppm testoutp.jpg \ + testoutt.jpg + +# Install jconfig.h +install-data-local: + $(mkinstalldirs) $(DESTDIR)$(includedir) + $(INSTALL_HEADER) jconfig.h $(DESTDIR)$(includedir)/jconfig.h + +# Uninstall jconfig.h +uninstall-local: + rm -f $(DESTDIR)$(includedir)/jconfig.h + +# Run tests +test: check-local +check-local: + rm -f testout* + ./djpeg -dct int -ppm -outfile testout.ppm $(srcdir)/testorig.jpg + ./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testorig.jpg + ./cjpeg -dct int -outfile testout.jpg $(srcdir)/testimg.ppm + ./djpeg -dct int -ppm -outfile testoutp.ppm $(srcdir)/testprog.jpg + ./cjpeg -dct int -progressive -opt -outfile testoutp.jpg $(srcdir)/testimg.ppm + ./jpegtran -outfile testoutt.jpg $(srcdir)/testprog.jpg + cmp $(srcdir)/testimg.ppm testout.ppm + cmp $(srcdir)/testimg.bmp testout.bmp + cmp $(srcdir)/testimg.jpg testout.jpg + cmp $(srcdir)/testimg.ppm testoutp.ppm + cmp $(srcdir)/testimgp.jpg testoutp.jpg + cmp $(srcdir)/testorig.jpg testoutt.jpg diff --git a/jpeg-8c/Makefile.in b/jpeg-8c/Makefile.in new file mode 100644 index 00000000..92033592 --- /dev/null +++ b/jpeg-8c/Makefile.in @@ -0,0 +1,1092 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Automake Makefile for the JPEG library +# +# This file is written by Bob Friesenhahn, Guido Vollbeding +# + + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +ANSI2KNR = @ANSI2KNR@ +@HAVE_LD_VERSION_SCRIPT_TRUE@am__append_1 = -Wl,--version-script=$(srcdir)/libjpeg.map +bin_PROGRAMS = cjpeg$(EXEEXT) djpeg$(EXEEXT) jpegtran$(EXEEXT) \ + rdjpgcom$(EXEEXT) wrjpgcom$(EXEEXT) +subdir = . +DIST_COMMON = README $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/configure $(am__configure_deps) \ + $(srcdir)/jconfig.cfg ansi2knr.c ansi2knr.1 depcomp \ + $(include_HEADERS) $(noinst_HEADERS) +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = jconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(includedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libjpeg_la_LIBADD = +am__objects_1 = jaricom$U.lo jcapimin$U.lo jcapistd$U.lo jcarith$U.lo \ + jccoefct$U.lo jccolor$U.lo jcdctmgr$U.lo jchuff$U.lo \ + jcinit$U.lo jcmainct$U.lo jcmarker$U.lo jcmaster$U.lo \ + jcomapi$U.lo jcparam$U.lo jcprepct$U.lo jcsample$U.lo \ + jctrans$U.lo jdapimin$U.lo jdapistd$U.lo jdarith$U.lo \ + jdatadst$U.lo jdatasrc$U.lo jdcoefct$U.lo jdcolor$U.lo \ + jddctmgr$U.lo jdhuff$U.lo jdinput$U.lo jdmainct$U.lo \ + jdmarker$U.lo jdmaster$U.lo jdmerge$U.lo jdpostct$U.lo \ + jdsample$U.lo jdtrans$U.lo jerror$U.lo jfdctflt$U.lo \ + jfdctfst$U.lo jfdctint$U.lo jidctflt$U.lo jidctfst$U.lo \ + jidctint$U.lo jquant1$U.lo jquant2$U.lo jutils$U.lo \ + jmemmgr$U.lo @MEMORYMGR@$U.lo +am_libjpeg_la_OBJECTS = $(am__objects_1) +libjpeg_la_OBJECTS = $(am_libjpeg_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libjpeg_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libjpeg_la_LDFLAGS) $(LDFLAGS) -o $@ +PROGRAMS = $(bin_PROGRAMS) +am_cjpeg_OBJECTS = cjpeg$U.$(OBJEXT) rdppm$U.$(OBJEXT) \ + rdgif$U.$(OBJEXT) rdtarga$U.$(OBJEXT) rdrle$U.$(OBJEXT) \ + rdbmp$U.$(OBJEXT) rdswitch$U.$(OBJEXT) cdjpeg$U.$(OBJEXT) +cjpeg_OBJECTS = $(am_cjpeg_OBJECTS) +cjpeg_DEPENDENCIES = libjpeg.la +am_djpeg_OBJECTS = djpeg$U.$(OBJEXT) wrppm$U.$(OBJEXT) \ + wrgif$U.$(OBJEXT) wrtarga$U.$(OBJEXT) wrrle$U.$(OBJEXT) \ + wrbmp$U.$(OBJEXT) rdcolmap$U.$(OBJEXT) cdjpeg$U.$(OBJEXT) +djpeg_OBJECTS = $(am_djpeg_OBJECTS) +djpeg_DEPENDENCIES = libjpeg.la +am_jpegtran_OBJECTS = jpegtran$U.$(OBJEXT) rdswitch$U.$(OBJEXT) \ + cdjpeg$U.$(OBJEXT) transupp$U.$(OBJEXT) +jpegtran_OBJECTS = $(am_jpegtran_OBJECTS) +jpegtran_DEPENDENCIES = libjpeg.la +am_rdjpgcom_OBJECTS = rdjpgcom$U.$(OBJEXT) +rdjpgcom_OBJECTS = $(am_rdjpgcom_OBJECTS) +rdjpgcom_LDADD = $(LDADD) +am_wrjpgcom_OBJECTS = wrjpgcom$U.$(OBJEXT) +wrjpgcom_OBJECTS = $(am_wrjpgcom_OBJECTS) +wrjpgcom_LDADD = $(LDADD) +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libjpeg_la_SOURCES) $(cjpeg_SOURCES) $(djpeg_SOURCES) \ + $(jpegtran_SOURCES) $(rdjpgcom_SOURCES) $(wrjpgcom_SOURCES) +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +HEADERS = $(include_HEADERS) $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEG_LIB_VERSION = @JPEG_LIB_VERSION@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MEMORYMGR = @MEMORYMGR@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +U = @U@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Sources to build library +LIBSOURCES = jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \ + jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \ + jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \ + jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \ + jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \ + jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \ + jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \ + jquant2.c jutils.c jmemmgr.c @MEMORYMGR@.c + + +# System dependent sources +SYSDEPSOURCES = jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c + +# Headers which are installed to support the library +INSTINCLUDES = jerror.h jmorecfg.h jpeglib.h + +# Headers which are not installed +OTHERINCLUDES = cderror.h cdjpeg.h jdct.h jinclude.h jmemsys.h jpegint.h \ + jversion.h transupp.h + + +# Manual pages (Automake uses 'MANS' for itself) +DISTMANS = cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 wrjpgcom.1 + +# Other documentation files +DOCS = README install.txt usage.txt wizard.txt example.c libjpeg.txt \ + structure.txt coderules.txt filelist.txt change.log + + +# Makefiles for various systems +MKFILES = configure Makefile.in makefile.ansi makefile.unix makefile.bcc \ + makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \ + makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ + makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ + maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ + makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \ + makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \ + makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \ + makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \ + makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \ + makefile.mms makefile.vms makvms.opt + + +# Configuration files +CONFIGFILES = jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ + jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ + jconfig.vms + + +# Support scripts for configure +CONFIGUREFILES = config.guess config.sub install-sh ltmain.sh depcomp missing + +# Miscellaneous support files +OTHERFILES = jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \ + libjpeg.map + + +# Test support files +TESTFILES = testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \ + testimgp.jpg + + +# libtool libraries to build +lib_LTLIBRARIES = libjpeg.la + +# Library sources for libjpeg.la +libjpeg_la_SOURCES = $(LIBSOURCES) + +# LDFLAGS for libjpeg.la +libjpeg_la_LDFLAGS = -no-undefined -version-info $(JPEG_LIB_VERSION) \ + $(am__append_1) + +# Executable sources & libs +cjpeg_SOURCES = cjpeg.c rdppm.c rdgif.c rdtarga.c rdrle.c rdbmp.c \ + rdswitch.c cdjpeg.c + +cjpeg_LDADD = libjpeg.la +djpeg_SOURCES = djpeg.c wrppm.c wrgif.c wrtarga.c wrrle.c wrbmp.c \ + rdcolmap.c cdjpeg.c + +djpeg_LDADD = libjpeg.la +jpegtran_SOURCES = jpegtran.c rdswitch.c cdjpeg.c transupp.c +jpegtran_LDADD = libjpeg.la +rdjpgcom_SOURCES = rdjpgcom.c +wrjpgcom_SOURCES = wrjpgcom.c + +# Manual pages to install +man_MANS = $(DISTMANS) + +# Headers to install +include_HEADERS = $(INSTINCLUDES) + +# Other distributed headers +noinst_HEADERS = $(OTHERINCLUDES) + +# Other distributed files +EXTRA_DIST = $(DOCS) $(DISTMANS) $(MKFILES) $(CONFIGFILES) $(SYSDEPSOURCES) \ + $(OTHERFILES) $(TESTFILES) + + +# Files to be cleaned +CLEANFILES = testout.ppm testout.bmp testout.jpg testoutp.ppm testoutp.jpg \ + testoutt.jpg + +all: jconfig.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +am--refresh: + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +jconfig.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/jconfig.cfg $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status jconfig.h +$(srcdir)/jconfig.cfg: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f jconfig.h stamp-h1 +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libjpeg.la: $(libjpeg_la_OBJECTS) $(libjpeg_la_DEPENDENCIES) + $(AM_V_CCLD)$(libjpeg_la_LINK) -rpath $(libdir) $(libjpeg_la_OBJECTS) $(libjpeg_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +cjpeg$(EXEEXT): $(cjpeg_OBJECTS) $(cjpeg_DEPENDENCIES) + @rm -f cjpeg$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(cjpeg_OBJECTS) $(cjpeg_LDADD) $(LIBS) +djpeg$(EXEEXT): $(djpeg_OBJECTS) $(djpeg_DEPENDENCIES) + @rm -f djpeg$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(djpeg_OBJECTS) $(djpeg_LDADD) $(LIBS) +jpegtran$(EXEEXT): $(jpegtran_OBJECTS) $(jpegtran_DEPENDENCIES) + @rm -f jpegtran$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(jpegtran_OBJECTS) $(jpegtran_LDADD) $(LIBS) +rdjpgcom$(EXEEXT): $(rdjpgcom_OBJECTS) $(rdjpgcom_DEPENDENCIES) + @rm -f rdjpgcom$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(rdjpgcom_OBJECTS) $(rdjpgcom_LDADD) $(LIBS) +wrjpgcom$(EXEEXT): $(wrjpgcom_OBJECTS) $(wrjpgcom_DEPENDENCIES) + @rm -f wrjpgcom$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(wrjpgcom_OBJECTS) $(wrjpgcom_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c +./ansi2knr: ansi2knr.$(OBJEXT) + $(LINK) ansi2knr.$(OBJEXT) $(LIBS) +ansi2knr.$(OBJEXT): $(CONFIG_HEADER) + +clean-krextra: + -rm -f ansi2knr + +mostlyclean-kr: + -test "$U" = "" || rm -f *_.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/@MEMORYMGR@$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdjpeg$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cjpeg$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/djpeg$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jaricom$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcapimin$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcapistd$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcarith$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jccoefct$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jccolor$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcdctmgr$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jchuff$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcinit$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcmainct$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcmarker$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcmaster$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcomapi$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcparam$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcprepct$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcsample$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jctrans$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdapimin$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdapistd$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdarith$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdatadst$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdatasrc$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdcoefct$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdcolor$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jddctmgr$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdhuff$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdinput$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdmainct$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdmarker$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdmaster$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdmerge$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdpostct$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdsample$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdtrans$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jerror$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jfdctflt$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jfdctfst$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jfdctint$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jidctflt$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jidctfst$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jidctint$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jmemmgr$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jpegtran$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jquant1$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jquant2$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jutils$U.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdbmp$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdcolmap$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdgif$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdjpgcom$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdppm$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdrle$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdswitch$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdtarga$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transupp$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrbmp$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrgif$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrjpgcom$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrppm$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrrle$U.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrtarga$U.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@MEMORYMGR@_.c: @MEMORYMGR@.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/@MEMORYMGR@.c; then echo $(srcdir)/@MEMORYMGR@.c; else echo @MEMORYMGR@.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +cdjpeg_.c: cdjpeg.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/cdjpeg.c; then echo $(srcdir)/cdjpeg.c; else echo cdjpeg.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +cjpeg_.c: cjpeg.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/cjpeg.c; then echo $(srcdir)/cjpeg.c; else echo cjpeg.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +djpeg_.c: djpeg.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/djpeg.c; then echo $(srcdir)/djpeg.c; else echo djpeg.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jaricom_.c: jaricom.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jaricom.c; then echo $(srcdir)/jaricom.c; else echo jaricom.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcapimin_.c: jcapimin.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcapimin.c; then echo $(srcdir)/jcapimin.c; else echo jcapimin.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcapistd_.c: jcapistd.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcapistd.c; then echo $(srcdir)/jcapistd.c; else echo jcapistd.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcarith_.c: jcarith.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcarith.c; then echo $(srcdir)/jcarith.c; else echo jcarith.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jccoefct_.c: jccoefct.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jccoefct.c; then echo $(srcdir)/jccoefct.c; else echo jccoefct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jccolor_.c: jccolor.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jccolor.c; then echo $(srcdir)/jccolor.c; else echo jccolor.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcdctmgr_.c: jcdctmgr.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcdctmgr.c; then echo $(srcdir)/jcdctmgr.c; else echo jcdctmgr.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jchuff_.c: jchuff.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jchuff.c; then echo $(srcdir)/jchuff.c; else echo jchuff.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcinit_.c: jcinit.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcinit.c; then echo $(srcdir)/jcinit.c; else echo jcinit.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcmainct_.c: jcmainct.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcmainct.c; then echo $(srcdir)/jcmainct.c; else echo jcmainct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcmarker_.c: jcmarker.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcmarker.c; then echo $(srcdir)/jcmarker.c; else echo jcmarker.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcmaster_.c: jcmaster.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcmaster.c; then echo $(srcdir)/jcmaster.c; else echo jcmaster.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcomapi_.c: jcomapi.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcomapi.c; then echo $(srcdir)/jcomapi.c; else echo jcomapi.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcparam_.c: jcparam.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcparam.c; then echo $(srcdir)/jcparam.c; else echo jcparam.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcprepct_.c: jcprepct.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcprepct.c; then echo $(srcdir)/jcprepct.c; else echo jcprepct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jcsample_.c: jcsample.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcsample.c; then echo $(srcdir)/jcsample.c; else echo jcsample.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jctrans_.c: jctrans.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jctrans.c; then echo $(srcdir)/jctrans.c; else echo jctrans.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdapimin_.c: jdapimin.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdapimin.c; then echo $(srcdir)/jdapimin.c; else echo jdapimin.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdapistd_.c: jdapistd.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdapistd.c; then echo $(srcdir)/jdapistd.c; else echo jdapistd.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdarith_.c: jdarith.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdarith.c; then echo $(srcdir)/jdarith.c; else echo jdarith.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdatadst_.c: jdatadst.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdatadst.c; then echo $(srcdir)/jdatadst.c; else echo jdatadst.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdatasrc_.c: jdatasrc.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdatasrc.c; then echo $(srcdir)/jdatasrc.c; else echo jdatasrc.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdcoefct_.c: jdcoefct.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdcoefct.c; then echo $(srcdir)/jdcoefct.c; else echo jdcoefct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdcolor_.c: jdcolor.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdcolor.c; then echo $(srcdir)/jdcolor.c; else echo jdcolor.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jddctmgr_.c: jddctmgr.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jddctmgr.c; then echo $(srcdir)/jddctmgr.c; else echo jddctmgr.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdhuff_.c: jdhuff.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdhuff.c; then echo $(srcdir)/jdhuff.c; else echo jdhuff.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdinput_.c: jdinput.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdinput.c; then echo $(srcdir)/jdinput.c; else echo jdinput.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdmainct_.c: jdmainct.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdmainct.c; then echo $(srcdir)/jdmainct.c; else echo jdmainct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdmarker_.c: jdmarker.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdmarker.c; then echo $(srcdir)/jdmarker.c; else echo jdmarker.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdmaster_.c: jdmaster.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdmaster.c; then echo $(srcdir)/jdmaster.c; else echo jdmaster.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdmerge_.c: jdmerge.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdmerge.c; then echo $(srcdir)/jdmerge.c; else echo jdmerge.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdpostct_.c: jdpostct.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdpostct.c; then echo $(srcdir)/jdpostct.c; else echo jdpostct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdsample_.c: jdsample.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdsample.c; then echo $(srcdir)/jdsample.c; else echo jdsample.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jdtrans_.c: jdtrans.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdtrans.c; then echo $(srcdir)/jdtrans.c; else echo jdtrans.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jerror_.c: jerror.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jerror.c; then echo $(srcdir)/jerror.c; else echo jerror.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jfdctflt_.c: jfdctflt.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jfdctflt.c; then echo $(srcdir)/jfdctflt.c; else echo jfdctflt.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jfdctfst_.c: jfdctfst.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jfdctfst.c; then echo $(srcdir)/jfdctfst.c; else echo jfdctfst.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jfdctint_.c: jfdctint.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jfdctint.c; then echo $(srcdir)/jfdctint.c; else echo jfdctint.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jidctflt_.c: jidctflt.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jidctflt.c; then echo $(srcdir)/jidctflt.c; else echo jidctflt.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jidctfst_.c: jidctfst.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jidctfst.c; then echo $(srcdir)/jidctfst.c; else echo jidctfst.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jidctint_.c: jidctint.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jidctint.c; then echo $(srcdir)/jidctint.c; else echo jidctint.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jmemmgr_.c: jmemmgr.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jmemmgr.c; then echo $(srcdir)/jmemmgr.c; else echo jmemmgr.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jpegtran_.c: jpegtran.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jpegtran.c; then echo $(srcdir)/jpegtran.c; else echo jpegtran.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jquant1_.c: jquant1.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jquant1.c; then echo $(srcdir)/jquant1.c; else echo jquant1.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jquant2_.c: jquant2.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jquant2.c; then echo $(srcdir)/jquant2.c; else echo jquant2.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +jutils_.c: jutils.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jutils.c; then echo $(srcdir)/jutils.c; else echo jutils.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdbmp_.c: rdbmp.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdbmp.c; then echo $(srcdir)/rdbmp.c; else echo rdbmp.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdcolmap_.c: rdcolmap.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdcolmap.c; then echo $(srcdir)/rdcolmap.c; else echo rdcolmap.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdgif_.c: rdgif.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdgif.c; then echo $(srcdir)/rdgif.c; else echo rdgif.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdjpgcom_.c: rdjpgcom.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdjpgcom.c; then echo $(srcdir)/rdjpgcom.c; else echo rdjpgcom.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdppm_.c: rdppm.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdppm.c; then echo $(srcdir)/rdppm.c; else echo rdppm.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdrle_.c: rdrle.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdrle.c; then echo $(srcdir)/rdrle.c; else echo rdrle.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdswitch_.c: rdswitch.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdswitch.c; then echo $(srcdir)/rdswitch.c; else echo rdswitch.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +rdtarga_.c: rdtarga.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdtarga.c; then echo $(srcdir)/rdtarga.c; else echo rdtarga.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +transupp_.c: transupp.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/transupp.c; then echo $(srcdir)/transupp.c; else echo transupp.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +wrbmp_.c: wrbmp.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrbmp.c; then echo $(srcdir)/wrbmp.c; else echo wrbmp.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +wrgif_.c: wrgif.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrgif.c; then echo $(srcdir)/wrgif.c; else echo wrgif.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +wrjpgcom_.c: wrjpgcom.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrjpgcom.c; then echo $(srcdir)/wrjpgcom.c; else echo wrjpgcom.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +wrppm_.c: wrppm.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrppm.c; then echo $(srcdir)/wrppm.c; else echo wrppm.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +wrrle_.c: wrrle.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrrle.c; then echo $(srcdir)/wrrle.c; else echo wrrle.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +wrtarga_.c: wrtarga.c $(ANSI2KNR) + $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrtarga.c; then echo $(srcdir)/wrtarga.c; else echo wrtarga.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ +@MEMORYMGR@_.$(OBJEXT) @MEMORYMGR@_.lo cdjpeg_.$(OBJEXT) cdjpeg_.lo \ +cjpeg_.$(OBJEXT) cjpeg_.lo djpeg_.$(OBJEXT) djpeg_.lo \ +jaricom_.$(OBJEXT) jaricom_.lo jcapimin_.$(OBJEXT) jcapimin_.lo \ +jcapistd_.$(OBJEXT) jcapistd_.lo jcarith_.$(OBJEXT) jcarith_.lo \ +jccoefct_.$(OBJEXT) jccoefct_.lo jccolor_.$(OBJEXT) jccolor_.lo \ +jcdctmgr_.$(OBJEXT) jcdctmgr_.lo jchuff_.$(OBJEXT) jchuff_.lo \ +jcinit_.$(OBJEXT) jcinit_.lo jcmainct_.$(OBJEXT) jcmainct_.lo \ +jcmarker_.$(OBJEXT) jcmarker_.lo jcmaster_.$(OBJEXT) jcmaster_.lo \ +jcomapi_.$(OBJEXT) jcomapi_.lo jcparam_.$(OBJEXT) jcparam_.lo \ +jcprepct_.$(OBJEXT) jcprepct_.lo jcsample_.$(OBJEXT) jcsample_.lo \ +jctrans_.$(OBJEXT) jctrans_.lo jdapimin_.$(OBJEXT) jdapimin_.lo \ +jdapistd_.$(OBJEXT) jdapistd_.lo jdarith_.$(OBJEXT) jdarith_.lo \ +jdatadst_.$(OBJEXT) jdatadst_.lo jdatasrc_.$(OBJEXT) jdatasrc_.lo \ +jdcoefct_.$(OBJEXT) jdcoefct_.lo jdcolor_.$(OBJEXT) jdcolor_.lo \ +jddctmgr_.$(OBJEXT) jddctmgr_.lo jdhuff_.$(OBJEXT) jdhuff_.lo \ +jdinput_.$(OBJEXT) jdinput_.lo jdmainct_.$(OBJEXT) jdmainct_.lo \ +jdmarker_.$(OBJEXT) jdmarker_.lo jdmaster_.$(OBJEXT) jdmaster_.lo \ +jdmerge_.$(OBJEXT) jdmerge_.lo jdpostct_.$(OBJEXT) jdpostct_.lo \ +jdsample_.$(OBJEXT) jdsample_.lo jdtrans_.$(OBJEXT) jdtrans_.lo \ +jerror_.$(OBJEXT) jerror_.lo jfdctflt_.$(OBJEXT) jfdctflt_.lo \ +jfdctfst_.$(OBJEXT) jfdctfst_.lo jfdctint_.$(OBJEXT) jfdctint_.lo \ +jidctflt_.$(OBJEXT) jidctflt_.lo jidctfst_.$(OBJEXT) jidctfst_.lo \ +jidctint_.$(OBJEXT) jidctint_.lo jmemmgr_.$(OBJEXT) jmemmgr_.lo \ +jpegtran_.$(OBJEXT) jpegtran_.lo jquant1_.$(OBJEXT) jquant1_.lo \ +jquant2_.$(OBJEXT) jquant2_.lo jutils_.$(OBJEXT) jutils_.lo \ +rdbmp_.$(OBJEXT) rdbmp_.lo rdcolmap_.$(OBJEXT) rdcolmap_.lo \ +rdgif_.$(OBJEXT) rdgif_.lo rdjpgcom_.$(OBJEXT) rdjpgcom_.lo \ +rdppm_.$(OBJEXT) rdppm_.lo rdrle_.$(OBJEXT) rdrle_.lo \ +rdswitch_.$(OBJEXT) rdswitch_.lo rdtarga_.$(OBJEXT) rdtarga_.lo \ +transupp_.$(OBJEXT) transupp_.lo wrbmp_.$(OBJEXT) wrbmp_.lo \ +wrgif_.$(OBJEXT) wrgif_.lo wrjpgcom_.$(OBJEXT) wrjpgcom_.lo \ +wrppm_.$(OBJEXT) wrppm_.lo wrrle_.$(OBJEXT) wrrle_.lo \ +wrtarga_.$(OBJEXT) wrtarga_.lo : $(ANSI2KNR) + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(includedir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) jconfig.cfg $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) jconfig.cfg $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) jconfig.cfg $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) jconfig.cfg $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(ANSI2KNR) $(LTLIBRARIES) $(PROGRAMS) $(MANS) \ + $(HEADERS) jconfig.h +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-krextra \ + clean-libLTLIBRARIES clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local install-includeHEADERS install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic mostlyclean-kr \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ + uninstall-libLTLIBRARIES uninstall-local uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: all check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am am--refresh check check-am check-local \ + clean clean-binPROGRAMS clean-generic clean-krextra \ + clean-libLTLIBRARIES clean-libtool ctags distclean \ + distclean-compile distclean-generic distclean-hdr \ + distclean-libtool distclean-tags dvi dvi-am html html-am info \ + info-am install install-am install-binPROGRAMS install-data \ + install-data-am install-data-local install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-includeHEADERS install-info install-info-am \ + install-libLTLIBRARIES install-man install-man1 install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-kr mostlyclean-libtool pdf \ + pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-includeHEADERS \ + uninstall-libLTLIBRARIES uninstall-local uninstall-man \ + uninstall-man1 + + +# Install jconfig.h +install-data-local: + $(mkinstalldirs) $(DESTDIR)$(includedir) + $(INSTALL_HEADER) jconfig.h $(DESTDIR)$(includedir)/jconfig.h + +# Uninstall jconfig.h +uninstall-local: + rm -f $(DESTDIR)$(includedir)/jconfig.h + +# Run tests +test: check-local +check-local: + rm -f testout* + ./djpeg -dct int -ppm -outfile testout.ppm $(srcdir)/testorig.jpg + ./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testorig.jpg + ./cjpeg -dct int -outfile testout.jpg $(srcdir)/testimg.ppm + ./djpeg -dct int -ppm -outfile testoutp.ppm $(srcdir)/testprog.jpg + ./cjpeg -dct int -progressive -opt -outfile testoutp.jpg $(srcdir)/testimg.ppm + ./jpegtran -outfile testoutt.jpg $(srcdir)/testprog.jpg + cmp $(srcdir)/testimg.ppm testout.ppm + cmp $(srcdir)/testimg.bmp testout.bmp + cmp $(srcdir)/testimg.jpg testout.jpg + cmp $(srcdir)/testimg.ppm testoutp.ppm + cmp $(srcdir)/testimgp.jpg testoutp.jpg + cmp $(srcdir)/testorig.jpg testoutt.jpg + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/jpeg-8c/README b/jpeg-8c/README new file mode 100644 index 00000000..451265d7 --- /dev/null +++ b/jpeg-8c/README @@ -0,0 +1,326 @@ +The Independent JPEG Group's JPEG software +========================================== + +README for release 8c of 16-Jan-2011 +==================================== + +This distribution contains the eighth public release of the Independent JPEG +Group's free JPEG software. You are welcome to redistribute this software and +to use it for any purpose, subject to the conditions under LEGAL ISSUES, below. + +This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone, +Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson, +Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers, +and other members of the Independent JPEG Group. + +IJG is not affiliated with the official ISO JPEG standards committee. + + +DOCUMENTATION ROADMAP +===================== + +This file contains the following sections: + +OVERVIEW General description of JPEG and the IJG software. +LEGAL ISSUES Copyright, lack of warranty, terms of distribution. +REFERENCES Where to learn more about JPEG. +ARCHIVE LOCATIONS Where to find newer versions of this software. +ACKNOWLEDGMENTS Special thanks. +FILE FORMAT WARS Software *not* to get. +TO DO Plans for future IJG releases. + +Other documentation files in the distribution are: + +User documentation: + install.txt How to configure and install the IJG software. + usage.txt Usage instructions for cjpeg, djpeg, jpegtran, + rdjpgcom, and wrjpgcom. + *.1 Unix-style man pages for programs (same info as usage.txt). + wizard.txt Advanced usage instructions for JPEG wizards only. + change.log Version-to-version change highlights. +Programmer and internal documentation: + libjpeg.txt How to use the JPEG library in your own programs. + example.c Sample code for calling the JPEG library. + structure.txt Overview of the JPEG library's internal structure. + filelist.txt Road map of IJG files. + coderules.txt Coding style rules --- please read if you contribute code. + +Please read at least the files install.txt and usage.txt. Some information +can also be found in the JPEG FAQ (Frequently Asked Questions) article. See +ARCHIVE LOCATIONS below to find out where to obtain the FAQ article. + +If you want to understand how the JPEG code works, we suggest reading one or +more of the REFERENCES, then looking at the documentation files (in roughly +the order listed) before diving into the code. + + +OVERVIEW +======== + +This package contains C software to implement JPEG image encoding, decoding, +and transcoding. JPEG (pronounced "jay-peg") is a standardized compression +method for full-color and gray-scale images. + +This software implements JPEG baseline, extended-sequential, and progressive +compression processes. Provision is made for supporting all variants of these +processes, although some uncommon parameter settings aren't implemented yet. +We have made no provision for supporting the hierarchical or lossless +processes defined in the standard. + +We provide a set of library routines for reading and writing JPEG image files, +plus two sample applications "cjpeg" and "djpeg", which use the library to +perform conversion between JPEG and some other popular image file formats. +The library is intended to be reused in other applications. + +In order to support file conversion and viewing software, we have included +considerable functionality beyond the bare JPEG coding/decoding capability; +for example, the color quantization modules are not strictly part of JPEG +decoding, but they are essential for output to colormapped file formats or +colormapped displays. These extra functions can be compiled out of the +library if not required for a particular application. + +We have also included "jpegtran", a utility for lossless transcoding between +different JPEG processes, and "rdjpgcom" and "wrjpgcom", two simple +applications for inserting and extracting textual comments in JFIF files. + +The emphasis in designing this software has been on achieving portability and +flexibility, while also making it fast enough to be useful. In particular, +the software is not intended to be read as a tutorial on JPEG. (See the +REFERENCES section for introductory material.) Rather, it is intended to +be reliable, portable, industrial-strength code. We do not claim to have +achieved that goal in every aspect of the software, but we strive for it. + +We welcome the use of this software as a component of commercial products. +No royalty is required, but we do ask for an acknowledgement in product +documentation, as described under LEGAL ISSUES. + + +LEGAL ISSUES +============ + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +ansi2knr.c is included in this distribution by permission of L. Peter Deutsch, +sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA. +ansi2knr.c is NOT covered by the above copyright and conditions, but instead +by the usual distribution terms of the Free Software Foundation; principally, +that you must include source code if you redistribute it. (See the file +ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part +of any program generated from the IJG code, this does not limit you more than +the foregoing paragraphs do. + +The Unix configuration script "configure" was produced with GNU Autoconf. +It is copyright by the Free Software Foundation but is freely distributable. +The same holds for its supporting scripts (config.guess, config.sub, +ltmain.sh). Another support script, install-sh, is copyright by X Consortium +but is also freely distributable. + +The IJG distribution formerly included code to read and write GIF files. +To avoid entanglement with the Unisys LZW patent, GIF reading support has +been removed altogether, and the GIF writer has been simplified to produce +"uncompressed GIFs". This technique does not use the LZW algorithm; the +resulting GIF files are larger than usual, but are readable by all standard +GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + + +REFERENCES +========== + +We recommend reading one or more of these references before trying to +understand the innards of the JPEG software. + +The best short technical introduction to the JPEG compression algorithm is + Wallace, Gregory K. "The JPEG Still Picture Compression Standard", + Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44. +(Adjacent articles in that issue discuss MPEG motion picture compression, +applications of JPEG, and related topics.) If you don't have the CACM issue +handy, a PostScript file containing a revised version of Wallace's article is +available at http://www.ijg.org/files/wallace.ps.gz. The file (actually +a preprint for an article that appeared in IEEE Trans. Consumer Electronics) +omits the sample images that appeared in CACM, but it includes corrections +and some added material. Note: the Wallace article is copyright ACM and IEEE, +and it may not be used for commercial purposes. + +A somewhat less technical, more leisurely introduction to JPEG can be found in +"The Data Compression Book" by Mark Nelson and Jean-loup Gailly, published by +M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1. This book provides +good explanations and example C code for a multitude of compression methods +including JPEG. It is an excellent source if you are comfortable reading C +code but don't know much about data compression in general. The book's JPEG +sample code is far from industrial-strength, but when you are ready to look +at a full implementation, you've got one here... + +The best currently available description of JPEG is the textbook "JPEG Still +Image Data Compression Standard" by William B. Pennebaker and Joan L. +Mitchell, published by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1. +Price US$59.95, 638 pp. The book includes the complete text of the ISO JPEG +standards (DIS 10918-1 and draft DIS 10918-2). +Although this is by far the most detailed and comprehensive exposition of +JPEG publicly available, we point out that it is still missing an explanation +of the most essential properties and algorithms of the underlying DCT +technology. +If you think that you know about DCT-based JPEG after reading this book, +then you are in delusion. The real fundamentals and corresponding potential +of DCT-based JPEG are not publicly known so far, and that is the reason for +all the mistaken developments taking place in the image coding domain. + +The original JPEG standard is divided into two parts, Part 1 being the actual +specification, while Part 2 covers compliance testing methods. Part 1 is +titled "Digital Compression and Coding of Continuous-tone Still Images, +Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS +10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of +Continuous-tone Still Images, Part 2: Compliance testing" and has document +numbers ISO/IEC IS 10918-2, ITU-T T.83. +IJG JPEG 8 introduces an implementation of the JPEG SmartScale extension +which is specified in a contributed document at ITU and ISO with title "ITU-T +JPEG-Plus Proposal for Extending ITU-T T.81 for Advanced Image Coding", April +2006, Geneva, Switzerland. The latest version of the document is Revision 3. + +The JPEG standard does not specify all details of an interchangeable file +format. For the omitted details we follow the "JFIF" conventions, revision +1.02. JFIF 1.02 has been adopted as an Ecma International Technical Report +and thus received a formal publication status. It is available as a free +download in PDF format from +http://www.ecma-international.org/publications/techreports/E-TR-098.htm. +A PostScript version of the JFIF document is available at +http://www.ijg.org/files/jfif.ps.gz. There is also a plain text version at +http://www.ijg.org/files/jfif.txt.gz, but it is missing the figures. + +The TIFF 6.0 file format specification can be obtained by FTP from +ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme +found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems. +IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6). +Instead, we recommend the JPEG design proposed by TIFF Technical Note #2 +(Compression tag 7). Copies of this Note can be obtained from +http://www.ijg.org/files/. It is expected that the next revision +of the TIFF spec will replace the 6.0 JPEG design with the Note's design. +Although IJG's own code does not support TIFF/JPEG, the free libtiff library +uses our library to implement TIFF/JPEG per the Note. + + +ARCHIVE LOCATIONS +================= + +The "official" archive site for this software is www.ijg.org. +The most recent released version can always be found there in +directory "files". This particular version will be archived as +http://www.ijg.org/files/jpegsrc.v8c.tar.gz, and in Windows-compatible +"zip" archive format as http://www.ijg.org/files/jpegsr8c.zip. + +The JPEG FAQ (Frequently Asked Questions) article is a source of some +general information about JPEG. +It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/ +and other news.answers archive sites, including the official news.answers +archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/. +If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu +with body + send usenet/news.answers/jpeg-faq/part1 + send usenet/news.answers/jpeg-faq/part2 + + +ACKNOWLEDGMENTS +=============== + +Thank to Juergen Bruder for providing me with a copy of the common DCT +algorithm article, only to find out that I had come to the same result +in a more direct and comprehensible way with a more generative approach. + +Thank to Istvan Sebestyen and Joan L. Mitchell for inviting me to the +ITU JPEG (Study Group 16) meeting in Geneva, Switzerland. + +Thank to Thomas Wiegand and Gary Sullivan for inviting me to the +Joint Video Team (MPEG & ITU) meeting in Geneva, Switzerland. + +Thank to John Korejwa and Massimo Ballerini for inviting me to +fruitful consultations in Boston, MA and Milan, Italy. + +Thank to Hendrik Elstner, Roland Fassauer, Simone Zuck, Guenther +Maier-Gerber, Walter Stoeber, Fred Schmitz, and Norbert Braunagel +for corresponding business development. + +Thank to Nico Zschach and Dirk Stelling of the technical support team +at the Digital Images company in Halle for providing me with extra +equipment for configuration tests. + +Thank to Richard F. Lyon (then of Foveon Inc.) for fruitful +communication about JPEG configuration in Sigma Photo Pro software. + +Thank to Andrew Finkenstadt for hosting the ijg.org site. + +Last but not least special thank to Thomas G. Lane for the original +design and development of this singular software package. + + +FILE FORMAT WARS +================ + +The ISO JPEG standards committee actually promotes different formats like +"JPEG 2000" or "JPEG XR" which are incompatible with original DCT-based +JPEG and which are based on faulty technologies. IJG therefore does not +and will not support such momentary mistakes (see REFERENCES). +We have little or no sympathy for the promotion of these formats. Indeed, +one of the original reasons for developing this free software was to help +force convergence on common, interoperable format standards for JPEG files. +Don't use an incompatible file format! +(In any case, our decoder will remain capable of reading existing JPEG +image files indefinitely.) + + +TO DO +===== + +Version 8 is the first release of a new generation JPEG standard +to overcome the limitations of the original JPEG specification. +More features are being prepared for coming releases... + +Please send bug reports, offers of help, etc. to jpeg-info@uc.ag. diff --git a/jpeg-8c/aclocal.m4 b/jpeg-8c/aclocal.m4 new file mode 100644 index 00000000..de31b7f4 --- /dev/null +++ b/jpeg-8c/aclocal.m4 @@ -0,0 +1,9471 @@ +# generated automatically by aclocal 1.11.1 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, +[m4_warning([this file was generated for autoconf 2.68. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 57 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# `#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test $lt_write_fail = 0 && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_REPLACE_SHELLFNS + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES +# -------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script which will find a shell with a builtin +# printf (which we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case "$ECHO" in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[ --with-sysroot[=DIR] Search for dependent libraries within DIR + (or the compiler's sysroot if not specified).], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and in which our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ F* | *Sun*Fortran*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS="$save_LDFLAGS"]) + if test "$lt_cv_irix_exported_symbol" = yes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], + [[If ld is used when linking, flag to hardcode $libdir into a binary + during linking. This must work even if $libdir does not exist]]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" + CFLAGS="$lt_save_CFLAGS" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) +# ------------------------------------------------------ +# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and +# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. +m4_defun([_LT_PROG_FUNCTION_REPLACE], +[dnl { +sed -e '/^$1 ()$/,/^} # $1 /c\ +$1 ()\ +{\ +m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) +} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: +]) + + +# _LT_PROG_REPLACE_SHELLFNS +# ------------------------- +# Replace existing portable implementations of several shell functions with +# equivalent extended shell implementations where those features are available.. +m4_defun([_LT_PROG_REPLACE_SHELLFNS], +[if test x"$xsi_shell" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) + + _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) + + _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) + + _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) +fi + +if test x"$lt_shell_append" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) + + _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl + func_quote_for_eval "${2}" +dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ + eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) +fi +]) + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine which file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS + +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 7 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) + +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) + +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 3293 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4]) +m4_define([LT_PACKAGE_REVISION], [1.3293]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4' +macro_revision='1.3293' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) + +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.11.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 10 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 5 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 16 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless `enable' is passed literally. +# For symmetry, `disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], +[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful + (and sometimes confusing) to the casual installer], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2005, 2006 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +AC_DEFUN([AM_C_PROTOTYPES], +[AC_REQUIRE([AC_C_PROTOTYPES]) +if test "$ac_cv_prog_cc_stdc" != no; then + U= ANSI2KNR= +else + U=_ ANSI2KNR=./ansi2knr +fi +# Ensure some checks needed by ansi2knr itself. +AC_REQUIRE([AC_HEADER_STDC]) +AC_CHECK_HEADERS([string.h]) +AC_SUBST([U])dnl +AC_SUBST([ANSI2KNR])dnl +_AM_SUBST_NOTMAKE([ANSI2KNR])dnl +]) + +AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# (`yes' being less verbose, `no' or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], +[ --enable-silent-rules less verbose build output (undo: `make V=1') + --disable-silent-rules verbose build output (undo: `make V=0')]) +case $enable_silent_rules in +yes) AM_DEFAULT_VERBOSITY=0;; +no) AM_DEFAULT_VERBOSITY=1;; +*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + diff --git a/jpeg-8c/ansi2knr.1 b/jpeg-8c/ansi2knr.1 new file mode 100644 index 00000000..f9ee5a63 --- /dev/null +++ b/jpeg-8c/ansi2knr.1 @@ -0,0 +1,36 @@ +.TH ANSI2KNR 1 "19 Jan 1996" +.SH NAME +ansi2knr \- convert ANSI C to Kernighan & Ritchie C +.SH SYNOPSIS +.I ansi2knr +[--varargs] input_file [output_file] +.SH DESCRIPTION +If no output_file is supplied, output goes to stdout. +.br +There are no error messages. +.sp +.I ansi2knr +recognizes function definitions by seeing a non-keyword identifier at the left +margin, followed by a left parenthesis, with a right parenthesis as the last +character on the line, and with a left brace as the first token on the +following line (ignoring possible intervening comments). It will recognize a +multi-line header provided that no intervening line ends with a left or right +brace or a semicolon. These algorithms ignore whitespace and comments, except +that the function name must be the first thing on the line. +.sp +The following constructs will confuse it: +.br + - Any other construct that starts at the left margin and follows the +above syntax (such as a macro or function call). +.br + - Some macros that tinker with the syntax of the function header. +.sp +The --varargs switch is obsolete, and is recognized only for +backwards compatibility. The present version of +.I ansi2knr +will always attempt to convert a ... argument to va_alist and va_dcl. +.SH AUTHOR +L. Peter Deutsch wrote the original ansi2knr and +continues to maintain the current version; most of the code in the current +version is his work. ansi2knr also includes contributions by Francois +Pinard and Jim Avera . diff --git a/jpeg-8c/ansi2knr.c b/jpeg-8c/ansi2knr.c new file mode 100644 index 00000000..e84c210b --- /dev/null +++ b/jpeg-8c/ansi2knr.c @@ -0,0 +1,739 @@ +/* Copyright (C) 1989, 2000 Aladdin Enterprises. All rights reserved. */ + +/*$Id: ansi2knr.c,v 1.14 2003/09/06 05:36:56 eggert Exp $*/ +/* Convert ANSI C function definitions to K&R ("traditional C") syntax */ + +/* +ansi2knr is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY. No author or distributor accepts responsibility to anyone for the +consequences of using it or for whether it serves any particular purpose or +works at all, unless he says so in writing. Refer to the GNU General Public +License (the "GPL") for full details. + +Everyone is granted permission to copy, modify and redistribute ansi2knr, +but only under the conditions described in the GPL. A copy of this license +is supposed to have been given to you along with ansi2knr so you can know +your rights and responsibilities. It should be in a file named COPYLEFT, +or, if there is no file named COPYLEFT, a file named COPYING. Among other +things, the copyright notice and this notice must be preserved on all +copies. + +We explicitly state here what we believe is already implied by the GPL: if +the ansi2knr program is distributed as a separate set of sources and a +separate executable file which are aggregated on a storage medium together +with another program, this in itself does not bring the other program under +the GPL, nor does the mere fact that such a program or the procedures for +constructing it invoke the ansi2knr executable bring any other part of the +program under the GPL. +*/ + +/* + * Usage: + ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]] + * --filename provides the file name for the #line directive in the output, + * overriding input_file (if present). + * If no input_file is supplied, input is read from stdin. + * If no output_file is supplied, output goes to stdout. + * There are no error messages. + * + * ansi2knr recognizes function definitions by seeing a non-keyword + * identifier at the left margin, followed by a left parenthesis, with a + * right parenthesis as the last character on the line, and with a left + * brace as the first token on the following line (ignoring possible + * intervening comments and/or preprocessor directives), except that a line + * consisting of only + * identifier1(identifier2) + * will not be considered a function definition unless identifier2 is + * the word "void", and a line consisting of + * identifier1(identifier2, <>) + * will not be considered a function definition. + * ansi2knr will recognize a multi-line header provided that no intervening + * line ends with a left or right brace or a semicolon. These algorithms + * ignore whitespace, comments, and preprocessor directives, except that + * the function name must be the first thing on the line. The following + * constructs will confuse it: + * - Any other construct that starts at the left margin and + * follows the above syntax (such as a macro or function call). + * - Some macros that tinker with the syntax of function headers. + */ + +/* + * The original and principal author of ansi2knr is L. Peter Deutsch + * . Other authors are noted in the change history + * that follows (in reverse chronological order): + + lpd 2000-04-12 backs out Eggert's changes because of bugs: + - concatlits didn't declare the type of its bufend argument; + - concatlits didn't recognize when it was inside a comment; + - scanstring could scan backward past the beginning of the string; when + - the check for \ + newline in scanstring was unnecessary. + + 2000-03-05 Paul Eggert + + Add support for concatenated string literals. + * ansi2knr.c (concatlits): New decl. + (main): Invoke concatlits to concatenate string literals. + (scanstring): Handle backslash-newline correctly. Work with + character constants. Fix bug when scanning backwards through + backslash-quote. Check for unterminated strings. + (convert1): Parse character constants, too. + (appendline, concatlits): New functions. + * ansi2knr.1: Document this. + + lpd 1999-08-17 added code to allow preprocessor directives + wherever comments are allowed + lpd 1999-04-12 added minor fixes from Pavel Roskin + for clean compilation with + gcc -W -Wall + lpd 1999-03-22 added hack to recognize lines consisting of + identifier1(identifier2, xxx) as *not* being procedures + lpd 1999-02-03 made indentation of preprocessor commands consistent + lpd 1999-01-28 fixed two bugs: a '/' in an argument list caused an + endless loop; quoted strings within an argument list + confused the parser + lpd 1999-01-24 added a check for write errors on the output, + suggested by Jim Meyering + lpd 1998-11-09 added further hack to recognize identifier(void) + as being a procedure + lpd 1998-10-23 added hack to recognize lines consisting of + identifier1(identifier2) as *not* being procedures + lpd 1997-12-08 made input_file optional; only closes input and/or + output file if not stdin or stdout respectively; prints + usage message on stderr rather than stdout; adds + --filename switch (changes suggested by + ) + lpd 1996-01-21 added code to cope with not HAVE_CONFIG_H and with + compilers that don't understand void, as suggested by + Tom Lane + lpd 1996-01-15 changed to require that the first non-comment token + on the line following a function header be a left brace, + to reduce sensitivity to macros, as suggested by Tom Lane + + lpd 1995-06-22 removed #ifndefs whose sole purpose was to define + undefined preprocessor symbols as 0; changed all #ifdefs + for configuration symbols to #ifs + lpd 1995-04-05 changed copyright notice to make it clear that + including ansi2knr in a program does not bring the entire + program under the GPL + lpd 1994-12-18 added conditionals for systems where ctype macros + don't handle 8-bit characters properly, suggested by + Francois Pinard ; + removed --varargs switch (this is now the default) + lpd 1994-10-10 removed CONFIG_BROKETS conditional + lpd 1994-07-16 added some conditionals to help GNU `configure', + suggested by Francois Pinard ; + properly erase prototype args in function parameters, + contributed by Jim Avera ; + correct error in writeblanks (it shouldn't erase EOLs) + lpd 1989-xx-xx original version + */ + +/* Most of the conditionals here are to make ansi2knr work with */ +/* or without the GNU configure machinery. */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include + +#if HAVE_CONFIG_H + +/* + For properly autoconfiguring ansi2knr, use AC_CONFIG_HEADER(config.h). + This will define HAVE_CONFIG_H and so, activate the following lines. + */ + +# if STDC_HEADERS || HAVE_STRING_H +# include +# else +# include +# endif + +#else /* not HAVE_CONFIG_H */ + +/* Otherwise do it the hard way */ + +# ifdef BSD +# include +# else +# ifdef VMS + extern int strlen(), strncmp(); +# else +# include +# endif +# endif + +#endif /* not HAVE_CONFIG_H */ + +#if STDC_HEADERS +# include +#else +/* + malloc and free should be declared in stdlib.h, + but if you've got a K&R compiler, they probably aren't. + */ +# ifdef MSDOS +# include +# else +# ifdef VMS + extern char *malloc(); + extern void free(); +# else + extern char *malloc(); + extern int free(); +# endif +# endif + +#endif + +/* Define NULL (for *very* old compilers). */ +#ifndef NULL +# define NULL (0) +#endif + +/* + * The ctype macros don't always handle 8-bit characters correctly. + * Compensate for this here. + */ +#ifdef isascii +# undef HAVE_ISASCII /* just in case */ +# define HAVE_ISASCII 1 +#else +#endif +#if STDC_HEADERS || !HAVE_ISASCII +# define is_ascii(c) 1 +#else +# define is_ascii(c) isascii(c) +#endif + +#define is_space(c) (is_ascii(c) && isspace(c)) +#define is_alpha(c) (is_ascii(c) && isalpha(c)) +#define is_alnum(c) (is_ascii(c) && isalnum(c)) + +/* Scanning macros */ +#define isidchar(ch) (is_alnum(ch) || (ch) == '_') +#define isidfirstchar(ch) (is_alpha(ch) || (ch) == '_') + +/* Forward references */ +char *ppdirforward(); +char *ppdirbackward(); +char *skipspace(); +char *scanstring(); +int writeblanks(); +int test1(); +int convert1(); + +/* The main program */ +int +main(argc, argv) + int argc; + char *argv[]; +{ FILE *in = stdin; + FILE *out = stdout; + char *filename = 0; + char *program_name = argv[0]; + char *output_name = 0; +#define bufsize 5000 /* arbitrary size */ + char *buf; + char *line; + char *more; + char *usage = + "Usage: ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]]\n"; + /* + * In previous versions, ansi2knr recognized a --varargs switch. + * If this switch was supplied, ansi2knr would attempt to convert + * a ... argument to va_alist and va_dcl; if this switch was not + * supplied, ansi2knr would simply drop any such arguments. + * Now, ansi2knr always does this conversion, and we only + * check for this switch for backward compatibility. + */ + int convert_varargs = 1; + int output_error; + + while ( argc > 1 && argv[1][0] == '-' ) { + if ( !strcmp(argv[1], "--varargs") ) { + convert_varargs = 1; + argc--; + argv++; + continue; + } + if ( !strcmp(argv[1], "--filename") && argc > 2 ) { + filename = argv[2]; + argc -= 2; + argv += 2; + continue; + } + fprintf(stderr, "%s: Unrecognized switch: %s\n", program_name, + argv[1]); + fprintf(stderr, usage); + exit(1); + } + switch ( argc ) + { + default: + fprintf(stderr, usage); + exit(0); + case 3: + output_name = argv[2]; + out = fopen(output_name, "w"); + if ( out == NULL ) { + fprintf(stderr, "%s: Cannot open output file %s\n", + program_name, output_name); + exit(1); + } + /* falls through */ + case 2: + in = fopen(argv[1], "r"); + if ( in == NULL ) { + fprintf(stderr, "%s: Cannot open input file %s\n", + program_name, argv[1]); + exit(1); + } + if ( filename == 0 ) + filename = argv[1]; + /* falls through */ + case 1: + break; + } + if ( filename ) + fprintf(out, "#line 1 \"%s\"\n", filename); + buf = malloc(bufsize); + if ( buf == NULL ) + { + fprintf(stderr, "Unable to allocate read buffer!\n"); + exit(1); + } + line = buf; + while ( fgets(line, (unsigned)(buf + bufsize - line), in) != NULL ) + { +test: line += strlen(line); + switch ( test1(buf) ) + { + case 2: /* a function header */ + convert1(buf, out, 1, convert_varargs); + break; + case 1: /* a function */ + /* Check for a { at the start of the next line. */ + more = ++line; +f: if ( line >= buf + (bufsize - 1) ) /* overflow check */ + goto wl; + if ( fgets(line, (unsigned)(buf + bufsize - line), in) == NULL ) + goto wl; + switch ( *skipspace(ppdirforward(more), 1) ) + { + case '{': + /* Definitely a function header. */ + convert1(buf, out, 0, convert_varargs); + fputs(more, out); + break; + case 0: + /* The next line was blank or a comment: */ + /* keep scanning for a non-comment. */ + line += strlen(line); + goto f; + default: + /* buf isn't a function header, but */ + /* more might be. */ + fputs(buf, out); + strcpy(buf, more); + line = buf; + goto test; + } + break; + case -1: /* maybe the start of a function */ + if ( line != buf + (bufsize - 1) ) /* overflow check */ + continue; + /* falls through */ + default: /* not a function */ +wl: fputs(buf, out); + break; + } + line = buf; + } + if ( line != buf ) + fputs(buf, out); + free(buf); + if ( output_name ) { + output_error = ferror(out); + output_error |= fclose(out); + } else { /* out == stdout */ + fflush(out); + output_error = ferror(out); + } + if ( output_error ) { + fprintf(stderr, "%s: error writing to %s\n", program_name, + (output_name ? output_name : "stdout")); + exit(1); + } + if ( in != stdin ) + fclose(in); + return 0; +} + +/* + * Skip forward or backward over one or more preprocessor directives. + */ +char * +ppdirforward(p) + char *p; +{ + for (; *p == '#'; ++p) { + for (; *p != '\r' && *p != '\n'; ++p) + if (*p == 0) + return p; + if (*p == '\r' && p[1] == '\n') + ++p; + } + return p; +} +char * +ppdirbackward(p, limit) + char *p; + char *limit; +{ + char *np = p; + + for (;; p = --np) { + if (*np == '\n' && np[-1] == '\r') + --np; + for (; np > limit && np[-1] != '\r' && np[-1] != '\n'; --np) + if (np[-1] == 0) + return np; + if (*np != '#') + return p; + } +} + +/* + * Skip over whitespace, comments, and preprocessor directives, + * in either direction. + */ +char * +skipspace(p, dir) + char *p; + int dir; /* 1 for forward, -1 for backward */ +{ + for ( ; ; ) { + while ( is_space(*p) ) + p += dir; + if ( !(*p == '/' && p[dir] == '*') ) + break; + p += dir; p += dir; + while ( !(*p == '*' && p[dir] == '/') ) { + if ( *p == 0 ) + return p; /* multi-line comment?? */ + p += dir; + } + p += dir; p += dir; + } + return p; +} + +/* Scan over a quoted string, in either direction. */ +char * +scanstring(p, dir) + char *p; + int dir; +{ + for (p += dir; ; p += dir) + if (*p == '"' && p[-dir] != '\\') + return p + dir; +} + +/* + * Write blanks over part of a string. + * Don't overwrite end-of-line characters. + */ +int +writeblanks(start, end) + char *start; + char *end; +{ char *p; + for ( p = start; p < end; p++ ) + if ( *p != '\r' && *p != '\n' ) + *p = ' '; + return 0; +} + +/* + * Test whether the string in buf is a function definition. + * The string may contain and/or end with a newline. + * Return as follows: + * 0 - definitely not a function definition; + * 1 - definitely a function definition; + * 2 - definitely a function prototype (NOT USED); + * -1 - may be the beginning of a function definition, + * append another line and look again. + * The reason we don't attempt to convert function prototypes is that + * Ghostscript's declaration-generating macros look too much like + * prototypes, and confuse the algorithms. + */ +int +test1(buf) + char *buf; +{ char *p = buf; + char *bend; + char *endfn; + int contin; + + if ( !isidfirstchar(*p) ) + return 0; /* no name at left margin */ + bend = skipspace(ppdirbackward(buf + strlen(buf) - 1, buf), -1); + switch ( *bend ) + { + case ';': contin = 0 /*2*/; break; + case ')': contin = 1; break; + case '{': return 0; /* not a function */ + case '}': return 0; /* not a function */ + default: contin = -1; + } + while ( isidchar(*p) ) + p++; + endfn = p; + p = skipspace(p, 1); + if ( *p++ != '(' ) + return 0; /* not a function */ + p = skipspace(p, 1); + if ( *p == ')' ) + return 0; /* no parameters */ + /* Check that the apparent function name isn't a keyword. */ + /* We only need to check for keywords that could be followed */ + /* by a left parenthesis (which, unfortunately, is most of them). */ + { static char *words[] = + { "asm", "auto", "case", "char", "const", "double", + "extern", "float", "for", "if", "int", "long", + "register", "return", "short", "signed", "sizeof", + "static", "switch", "typedef", "unsigned", + "void", "volatile", "while", 0 + }; + char **key = words; + char *kp; + unsigned len = endfn - buf; + + while ( (kp = *key) != 0 ) + { if ( strlen(kp) == len && !strncmp(kp, buf, len) ) + return 0; /* name is a keyword */ + key++; + } + } + { + char *id = p; + int len; + /* + * Check for identifier1(identifier2) and not + * identifier1(void), or identifier1(identifier2, xxxx). + */ + + while ( isidchar(*p) ) + p++; + len = p - id; + p = skipspace(p, 1); + if (*p == ',' || + (*p == ')' && (len != 4 || strncmp(id, "void", 4))) + ) + return 0; /* not a function */ + } + /* + * If the last significant character was a ), we need to count + * parentheses, because it might be part of a formal parameter + * that is a procedure. + */ + if (contin > 0) { + int level = 0; + + for (p = skipspace(buf, 1); *p; p = skipspace(p + 1, 1)) + level += (*p == '(' ? 1 : *p == ')' ? -1 : 0); + if (level > 0) + contin = -1; + } + return contin; +} + +/* Convert a recognized function definition or header to K&R syntax. */ +int +convert1(buf, out, header, convert_varargs) + char *buf; + FILE *out; + int header; /* Boolean */ + int convert_varargs; /* Boolean */ +{ char *endfn; + char *p; + /* + * The breaks table contains pointers to the beginning and end + * of each argument. + */ + char **breaks; + unsigned num_breaks = 2; /* for testing */ + char **btop; + char **bp; + char **ap; + char *vararg = 0; + + /* Pre-ANSI implementations don't agree on whether strchr */ + /* is called strchr or index, so we open-code it here. */ + for ( endfn = buf; *(endfn++) != '('; ) + ; +top: p = endfn; + breaks = (char **)malloc(sizeof(char *) * num_breaks * 2); + if ( breaks == NULL ) + { /* Couldn't allocate break table, give up */ + fprintf(stderr, "Unable to allocate break table!\n"); + fputs(buf, out); + return -1; + } + btop = breaks + num_breaks * 2 - 2; + bp = breaks; + /* Parse the argument list */ + do + { int level = 0; + char *lp = NULL; + char *rp = NULL; + char *end = NULL; + + if ( bp >= btop ) + { /* Filled up break table. */ + /* Allocate a bigger one and start over. */ + free((char *)breaks); + num_breaks <<= 1; + goto top; + } + *bp++ = p; + /* Find the end of the argument */ + for ( ; end == NULL; p++ ) + { switch(*p) + { + case ',': + if ( !level ) end = p; + break; + case '(': + if ( !level ) lp = p; + level++; + break; + case ')': + if ( --level < 0 ) end = p; + else rp = p; + break; + case '/': + if (p[1] == '*') + p = skipspace(p, 1) - 1; + break; + case '"': + p = scanstring(p, 1) - 1; + break; + default: + ; + } + } + /* Erase any embedded prototype parameters. */ + if ( lp && rp ) + writeblanks(lp + 1, rp); + p--; /* back up over terminator */ + /* Find the name being declared. */ + /* This is complicated because of procedure and */ + /* array modifiers. */ + for ( ; ; ) + { p = skipspace(p - 1, -1); + switch ( *p ) + { + case ']': /* skip array dimension(s) */ + case ')': /* skip procedure args OR name */ + { int level = 1; + while ( level ) + switch ( *--p ) + { + case ']': case ')': + level++; + break; + case '[': case '(': + level--; + break; + case '/': + if (p > buf && p[-1] == '*') + p = skipspace(p, -1) + 1; + break; + case '"': + p = scanstring(p, -1) + 1; + break; + default: ; + } + } + if ( *p == '(' && *skipspace(p + 1, 1) == '*' ) + { /* We found the name being declared */ + while ( !isidfirstchar(*p) ) + p = skipspace(p, 1) + 1; + goto found; + } + break; + default: + goto found; + } + } +found: if ( *p == '.' && p[-1] == '.' && p[-2] == '.' ) + { if ( convert_varargs ) + { *bp++ = "va_alist"; + vararg = p-2; + } + else + { p++; + if ( bp == breaks + 1 ) /* sole argument */ + writeblanks(breaks[0], p); + else + writeblanks(bp[-1] - 1, p); + bp--; + } + } + else + { while ( isidchar(*p) ) p--; + *bp++ = p+1; + } + p = end; + } + while ( *p++ == ',' ); + *bp = p; + /* Make a special check for 'void' arglist */ + if ( bp == breaks+2 ) + { p = skipspace(breaks[0], 1); + if ( !strncmp(p, "void", 4) ) + { p = skipspace(p+4, 1); + if ( p == breaks[2] - 1 ) + { bp = breaks; /* yup, pretend arglist is empty */ + writeblanks(breaks[0], p + 1); + } + } + } + /* Put out the function name and left parenthesis. */ + p = buf; + while ( p != endfn ) putc(*p, out), p++; + /* Put out the declaration. */ + if ( header ) + { fputs(");", out); + for ( p = breaks[0]; *p; p++ ) + if ( *p == '\r' || *p == '\n' ) + putc(*p, out); + } + else + { for ( ap = breaks+1; ap < bp; ap += 2 ) + { p = *ap; + while ( isidchar(*p) ) + putc(*p, out), p++; + if ( ap < bp - 1 ) + fputs(", ", out); + } + fputs(") ", out); + /* Put out the argument declarations */ + for ( ap = breaks+2; ap <= bp; ap += 2 ) + (*ap)[-1] = ';'; + if ( vararg != 0 ) + { *vararg = 0; + fputs(breaks[0], out); /* any prior args */ + fputs("va_dcl", out); /* the final arg */ + fputs(bp[0], out); + } + else + fputs(breaks[0], out); + } + free((char *)breaks); + return 0; +} diff --git a/jpeg-8c/cderror.h b/jpeg-8c/cderror.h new file mode 100644 index 00000000..e19c475c --- /dev/null +++ b/jpeg-8c/cderror.h @@ -0,0 +1,134 @@ +/* + * cderror.h + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * 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_EMPTY, "Empty BMP image") +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/jpeg-8c/cdjpeg.c b/jpeg-8c/cdjpeg.c new file mode 100644 index 00000000..b6250ff9 --- /dev/null +++ b/jpeg-8c/cdjpeg.c @@ -0,0 +1,181 @@ +/* + * cdjpeg.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 common support routines used by the IJG application + * programs (cjpeg, djpeg, jpegtran). + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ +#include /* to declare isupper(), tolower() */ +#ifdef NEED_SIGNAL_CATCHER +#include /* to declare signal() */ +#endif +#ifdef USE_SETMODE +#include /* to declare setmode()'s parameter macros */ +/* If you have setmode() but not , just delete this line: */ +#include /* to declare setmode() */ +#endif + + +/* + * Signal catcher to ensure that temporary files are removed before aborting. + * NB: for Amiga Manx C this is actually a global routine named _abort(); + * we put "#define signal_catcher _abort" in jconfig.h. Talk about bogus... + */ + +#ifdef NEED_SIGNAL_CATCHER + +static j_common_ptr sig_cinfo; + +void /* must be global for Manx C */ +signal_catcher (int signum) +{ + if (sig_cinfo != NULL) { + if (sig_cinfo->err != NULL) /* turn off trace output */ + sig_cinfo->err->trace_level = 0; + jpeg_destroy(sig_cinfo); /* clean up memory allocation & temp files */ + } + exit(EXIT_FAILURE); +} + + +GLOBAL(void) +enable_signal_catcher (j_common_ptr cinfo) +{ + sig_cinfo = cinfo; +#ifdef SIGINT /* not all systems have SIGINT */ + signal(SIGINT, signal_catcher); +#endif +#ifdef SIGTERM /* not all systems have SIGTERM */ + signal(SIGTERM, signal_catcher); +#endif +} + +#endif + + +/* + * Optional progress monitor: display a percent-done figure on stderr. + */ + +#ifdef PROGRESS_REPORT + +METHODDEF(void) +progress_monitor (j_common_ptr cinfo) +{ + cd_progress_ptr prog = (cd_progress_ptr) cinfo->progress; + int total_passes = prog->pub.total_passes + prog->total_extra_passes; + int percent_done = (int) (prog->pub.pass_counter*100L/prog->pub.pass_limit); + + if (percent_done != prog->percent_done) { + prog->percent_done = percent_done; + if (total_passes > 1) { + fprintf(stderr, "\rPass %d/%d: %3d%% ", + prog->pub.completed_passes + prog->completed_extra_passes + 1, + total_passes, percent_done); + } else { + fprintf(stderr, "\r %3d%% ", percent_done); + } + fflush(stderr); + } +} + + +GLOBAL(void) +start_progress_monitor (j_common_ptr cinfo, cd_progress_ptr progress) +{ + /* Enable progress display, unless trace output is on */ + if (cinfo->err->trace_level == 0) { + progress->pub.progress_monitor = progress_monitor; + progress->completed_extra_passes = 0; + progress->total_extra_passes = 0; + progress->percent_done = -1; + cinfo->progress = &progress->pub; + } +} + + +GLOBAL(void) +end_progress_monitor (j_common_ptr cinfo) +{ + /* Clear away progress display */ + if (cinfo->err->trace_level == 0) { + fprintf(stderr, "\r \r"); + fflush(stderr); + } +} + +#endif + + +/* + * Case-insensitive matching of possibly-abbreviated keyword switches. + * keyword is the constant keyword (must be lower case already), + * minchars is length of minimum legal abbreviation. + */ + +GLOBAL(boolean) +keymatch (char * arg, const char * keyword, int minchars) +{ + register int ca, ck; + register int nmatched = 0; + + while ((ca = *arg++) != '\0') { + if ((ck = *keyword++) == '\0') + return FALSE; /* arg longer than keyword, no good */ + if (isupper(ca)) /* force arg to lcase (assume ck is already) */ + ca = tolower(ca); + if (ca != ck) + return FALSE; /* no good */ + nmatched++; /* count matched characters */ + } + /* reached end of argument; fail if it's too short for unique abbrev */ + if (nmatched < minchars) + return FALSE; + return TRUE; /* A-OK */ +} + + +/* + * Routines to establish binary I/O mode for stdin and stdout. + * Non-Unix systems often require some hacking to get out of text mode. + */ + +GLOBAL(FILE *) +read_stdin (void) +{ + FILE * input_file = stdin; + +#ifdef USE_SETMODE /* need to hack file mode? */ + setmode(fileno(stdin), O_BINARY); +#endif +#ifdef USE_FDOPEN /* need to re-open in binary mode? */ + if ((input_file = fdopen(fileno(stdin), READ_BINARY)) == NULL) { + fprintf(stderr, "Cannot reopen stdin\n"); + exit(EXIT_FAILURE); + } +#endif + return input_file; +} + + +GLOBAL(FILE *) +write_stdout (void) +{ + FILE * output_file = stdout; + +#ifdef USE_SETMODE /* need to hack file mode? */ + setmode(fileno(stdout), O_BINARY); +#endif +#ifdef USE_FDOPEN /* need to re-open in binary mode? */ + if ((output_file = fdopen(fileno(stdout), WRITE_BINARY)) == NULL) { + fprintf(stderr, "Cannot reopen stdout\n"); + exit(EXIT_FAILURE); + } +#endif + return output_file; +} diff --git a/jpeg-8c/cdjpeg.h b/jpeg-8c/cdjpeg.h new file mode 100644 index 00000000..ed024ac3 --- /dev/null +++ b/jpeg-8c/cdjpeg.h @@ -0,0 +1,187 @@ +/* + * cdjpeg.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 contains common declarations for the sample applications + * cjpeg and djpeg. It is NOT used by the core JPEG library. + */ + +#define JPEG_CJPEG_DJPEG /* define proper options in jconfig.h */ +#define JPEG_INTERNAL_OPTIONS /* cjpeg.c,djpeg.c need to see xxx_SUPPORTED */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jerror.h" /* get library error codes too */ +#include "cderror.h" /* get application-specific error codes */ + + +/* + * Object interface for cjpeg's source file decoding modules + */ + +typedef struct cjpeg_source_struct * cjpeg_source_ptr; + +struct cjpeg_source_struct { + JMETHOD(void, start_input, (j_compress_ptr cinfo, + cjpeg_source_ptr sinfo)); + JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo, + cjpeg_source_ptr sinfo)); + JMETHOD(void, finish_input, (j_compress_ptr cinfo, + cjpeg_source_ptr sinfo)); + + FILE *input_file; + + JSAMPARRAY buffer; + JDIMENSION buffer_height; +}; + + +/* + * Object interface for djpeg's output file encoding modules + */ + +typedef struct djpeg_dest_struct * djpeg_dest_ptr; + +struct djpeg_dest_struct { + /* start_output is called after jpeg_start_decompress finishes. + * The color map will be ready at this time, if one is needed. + */ + JMETHOD(void, start_output, (j_decompress_ptr cinfo, + djpeg_dest_ptr dinfo)); + /* Emit the specified number of pixel rows from the buffer. */ + JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo, + djpeg_dest_ptr dinfo, + JDIMENSION rows_supplied)); + /* Finish up at the end of the image. */ + JMETHOD(void, finish_output, (j_decompress_ptr cinfo, + djpeg_dest_ptr dinfo)); + + /* Target file spec; filled in by djpeg.c after object is created. */ + FILE * output_file; + + /* Output pixel-row buffer. Created by module init or start_output. + * Width is cinfo->output_width * cinfo->output_components; + * height is buffer_height. + */ + JSAMPARRAY buffer; + JDIMENSION buffer_height; +}; + + +/* + * cjpeg/djpeg may need to perform extra passes to convert to or from + * the source/destination file format. The JPEG library does not know + * about these passes, but we'd like them to be counted by the progress + * monitor. We use an expanded progress monitor object to hold the + * additional pass count. + */ + +struct cdjpeg_progress_mgr { + struct jpeg_progress_mgr pub; /* fields known to JPEG library */ + int completed_extra_passes; /* extra passes completed */ + int total_extra_passes; /* total extra */ + /* last printed percentage stored here to avoid multiple printouts */ + int percent_done; +}; + +typedef struct cdjpeg_progress_mgr * cd_progress_ptr; + + +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jinit_read_bmp jIRdBMP +#define jinit_write_bmp jIWrBMP +#define jinit_read_gif jIRdGIF +#define jinit_write_gif jIWrGIF +#define jinit_read_ppm jIRdPPM +#define jinit_write_ppm jIWrPPM +#define jinit_read_rle jIRdRLE +#define jinit_write_rle jIWrRLE +#define jinit_read_targa jIRdTarga +#define jinit_write_targa jIWrTarga +#define read_quant_tables RdQTables +#define read_scan_script RdScnScript +#define set_quality_ratings SetQRates +#define set_quant_slots SetQSlots +#define set_sample_factors SetSFacts +#define read_color_map RdCMap +#define enable_signal_catcher EnSigCatcher +#define start_progress_monitor StProgMon +#define end_progress_monitor EnProgMon +#define read_stdin RdStdin +#define write_stdout WrStdout +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + +/* Module selection routines for I/O modules. */ + +EXTERN(cjpeg_source_ptr) jinit_read_bmp JPP((j_compress_ptr cinfo)); +EXTERN(djpeg_dest_ptr) jinit_write_bmp JPP((j_decompress_ptr cinfo, + boolean is_os2)); +EXTERN(cjpeg_source_ptr) jinit_read_gif JPP((j_compress_ptr cinfo)); +EXTERN(djpeg_dest_ptr) jinit_write_gif JPP((j_decompress_ptr cinfo)); +EXTERN(cjpeg_source_ptr) jinit_read_ppm JPP((j_compress_ptr cinfo)); +EXTERN(djpeg_dest_ptr) jinit_write_ppm JPP((j_decompress_ptr cinfo)); +EXTERN(cjpeg_source_ptr) jinit_read_rle JPP((j_compress_ptr cinfo)); +EXTERN(djpeg_dest_ptr) jinit_write_rle JPP((j_decompress_ptr cinfo)); +EXTERN(cjpeg_source_ptr) jinit_read_targa JPP((j_compress_ptr cinfo)); +EXTERN(djpeg_dest_ptr) jinit_write_targa JPP((j_decompress_ptr cinfo)); + +/* cjpeg support routines (in rdswitch.c) */ + +EXTERN(boolean) read_quant_tables JPP((j_compress_ptr cinfo, char * filename, + boolean force_baseline)); +EXTERN(boolean) read_scan_script JPP((j_compress_ptr cinfo, char * filename)); +EXTERN(boolean) set_quality_ratings JPP((j_compress_ptr cinfo, char *arg, + boolean force_baseline)); +EXTERN(boolean) set_quant_slots JPP((j_compress_ptr cinfo, char *arg)); +EXTERN(boolean) set_sample_factors JPP((j_compress_ptr cinfo, char *arg)); + +/* djpeg support routines (in rdcolmap.c) */ + +EXTERN(void) read_color_map JPP((j_decompress_ptr cinfo, FILE * infile)); + +/* common support routines (in cdjpeg.c) */ + +EXTERN(void) enable_signal_catcher JPP((j_common_ptr cinfo)); +EXTERN(void) start_progress_monitor JPP((j_common_ptr cinfo, + cd_progress_ptr progress)); +EXTERN(void) end_progress_monitor JPP((j_common_ptr cinfo)); +EXTERN(boolean) keymatch JPP((char * arg, const char * keyword, int minchars)); +EXTERN(FILE *) read_stdin JPP((void)); +EXTERN(FILE *) write_stdout JPP((void)); + +/* miscellaneous useful macros */ + +#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */ +#define READ_BINARY "r" +#define WRITE_BINARY "w" +#else +#ifdef VMS /* VMS is very nonstandard */ +#define READ_BINARY "rb", "ctx=stm" +#define WRITE_BINARY "wb", "ctx=stm" +#else /* standard ANSI-compliant case */ +#define READ_BINARY "rb" +#define WRITE_BINARY "wb" +#endif +#endif + +#ifndef EXIT_FAILURE /* define exit() codes if not provided */ +#define EXIT_FAILURE 1 +#endif +#ifndef EXIT_SUCCESS +#ifdef VMS +#define EXIT_SUCCESS 1 /* VMS is very nonstandard */ +#else +#define EXIT_SUCCESS 0 +#endif +#endif +#ifndef EXIT_WARNING +#ifdef VMS +#define EXIT_WARNING 1 /* VMS is very nonstandard */ +#else +#define EXIT_WARNING 2 +#endif +#endif diff --git a/jpeg-8c/change.log b/jpeg-8c/change.log new file mode 100644 index 00000000..94865b3f --- /dev/null +++ b/jpeg-8c/change.log @@ -0,0 +1,326 @@ +CHANGE LOG for Independent JPEG Group's JPEG software + + +Version 8c 16-Jan-2011 +----------------------- + +Add option to compression library and cjpeg (-block N) to use +different DCT block size. +All N from 1 to 16 are possible. Default is 8 (baseline format). +Larger values produce higher compression, +smaller values produce higher quality. +SmartScale capable decoder (introduced with IJG JPEG 8) required. + + +Version 8b 16-May-2010 +----------------------- + +Repair problem in new memory source manager with corrupt JPEG data. +Thank to Ted Campbell and Samuel Chun for the report. + +Repair problem in Makefile.am test target. +Thank to anonymous user for the report. + +Support MinGW installation with automatic configure. +Thank to Volker Grabsch for the suggestion. + + +Version 8a 28-Feb-2010 +----------------------- + +Writing tables-only datastreams via jpeg_write_tables works again. + +Support 32-bit BMPs (RGB image with Alpha channel) for read in cjpeg. +Thank to Brett Blackham for the suggestion. + +Improve accuracy in floating point IDCT calculation. +Thank to Robert Hooke for the hint. + + +Version 8 10-Jan-2010 +---------------------- + +jpegtran now supports the same -scale option as djpeg for "lossless" resize. +An implementation of the JPEG SmartScale extension is required for this +feature. A (draft) specification of the JPEG SmartScale extension is +available as a contributed document at ITU and ISO. Revision 2 or later +of the document is required (latest document version is Revision 3). +The SmartScale extension will enable more features beside lossless resize +in future implementations, as described in the document (new compression +options). + +Add sanity check in BMP reader module to avoid cjpeg crash for empty input +image (thank to Isaev Ildar of ISP RAS, Moscow, RU for reporting this error). + +Add data source and destination managers for read from and write to +memory buffers. New API functions jpeg_mem_src and jpeg_mem_dest. +Thank to Roberto Boni from Italy for the suggestion. + + +Version 7 27-Jun-2009 +---------------------- + +New scaled DCTs implemented. +djpeg now supports scalings N/8 with all N from 1 to 16. +cjpeg now supports scalings 8/N with all N from 1 to 16. +Scaled DCTs with size larger than 8 are now also used for resolving the +common 2x2 chroma subsampling case without additional spatial resampling. +Separate spatial resampling for those kind of files is now only necessary +for N>8 scaling cases. +Furthermore, separate scaled DCT functions are provided for direct resolving +of the common asymmetric subsampling cases (2x1 and 1x2) without additional +spatial resampling. + +cjpeg -quality option has been extended for support of separate quality +settings for luminance and chrominance (or in general, for every provided +quantization table slot). +New API function jpeg_default_qtables() and q_scale_factor array in library. + +Added -nosmooth option to cjpeg, complementary to djpeg. +New variable "do_fancy_downsampling" in library, complement to fancy +upsampling. Fancy upsampling now uses direct DCT scaling with sizes +larger than 8. The old method is not reversible and has been removed. + +Support arithmetic entropy encoding and decoding. +Added files jaricom.c, jcarith.c, jdarith.c. + +Straighten the file structure: +Removed files jidctred.c, jcphuff.c, jchuff.h, jdphuff.c, jdhuff.h. + +jpegtran has a new "lossless" cropping feature. + +Implement -perfect option in jpegtran, new API function +jtransform_perfect_transform() in transupp. (DP 204_perfect.dpatch) + +Better error messages for jpegtran fopen failure. +(DP 203_jpegtran_errmsg.dpatch) + +Fix byte order issue with 16bit PPM/PGM files in rdppm.c/wrppm.c: +according to Netpbm, the de facto standard implementation of the PNM formats, +the most significant byte is first. (DP 203_rdppm.dpatch) + +Add -raw option to rdjpgcom not to mangle the output. +(DP 205_rdjpgcom_raw.dpatch) + +Make rdjpgcom locale aware. (DP 201_rdjpgcom_locale.dpatch) + +Add extern "C" to jpeglib.h. +This avoids the need to put extern "C" { ... } around #include "jpeglib.h" +in your C++ application. Defining the symbol DONT_USE_EXTERN_C in the +configuration prevents this. (DP 202_jpeglib.h_c++.dpatch) + + +Version 6b 27-Mar-1998 +----------------------- + +jpegtran has new features for lossless image transformations (rotation +and flipping) as well as "lossless" reduction to grayscale. + +jpegtran now copies comments by default; it has a -copy switch to enable +copying all APPn blocks as well, or to suppress comments. (Formerly it +always suppressed comments and APPn blocks.) jpegtran now also preserves +JFIF version and resolution information. + +New decompressor library feature: COM and APPn markers found in the input +file can be saved in memory for later use by the application. (Before, +you had to code this up yourself with a custom marker processor.) + +There is an unused field "void * client_data" now in compress and decompress +parameter structs; this may be useful in some applications. + +JFIF version number information is now saved by the decoder and accepted by +the encoder. jpegtran uses this to copy the source file's version number, +to ensure "jpegtran -copy all" won't create bogus files that contain JFXX +extensions but claim to be version 1.01. Applications that generate their +own JFXX extension markers also (finally) have a supported way to cause the +encoder to emit JFIF version number 1.02. + +djpeg's trace mode reports JFIF 1.02 thumbnail images as such, rather +than as unknown APP0 markers. + +In -verbose mode, djpeg and rdjpgcom will try to print the contents of +APP12 markers as text. Some digital cameras store useful text information +in APP12 markers. + +Handling of truncated data streams is more robust: blocks beyond the one in +which the error occurs will be output as uniform gray, or left unchanged +if decoding a progressive JPEG. The appearance no longer depends on the +Huffman tables being used. + +Huffman tables are checked for validity much more carefully than before. + +To avoid the Unisys LZW patent, djpeg's GIF output capability has been +changed to produce "uncompressed GIFs", and cjpeg's GIF input capability +has been removed altogether. We're not happy about it either, but there +seems to be no good alternative. + +The configure script now supports building libjpeg as a shared library +on many flavors of Unix (all the ones that GNU libtool knows how to +build shared libraries for). Use "./configure --enable-shared" to +try this out. + +New jconfig file and makefiles for Microsoft Visual C++ and Developer Studio. +Also, a jconfig file and a build script for Metrowerks CodeWarrior +on Apple Macintosh. makefile.dj has been updated for DJGPP v2, and there +are miscellaneous other minor improvements in the makefiles. + +jmemmac.c now knows how to create temporary files following Mac System 7 +conventions. + +djpeg's -map switch is now able to read raw-format PPM files reliably. + +cjpeg -progressive -restart no longer generates any unnecessary DRI markers. + +Multiple calls to jpeg_simple_progression for a single JPEG object +no longer leak memory. + + +Version 6a 7-Feb-96 +-------------------- + +Library initialization sequence modified to detect version mismatches +and struct field packing mismatches between library and calling application. +This change requires applications to be recompiled, but does not require +any application source code change. + +All routine declarations changed to the style "GLOBAL(type) name ...", +that is, GLOBAL, LOCAL, METHODDEF, EXTERN are now macros taking the +routine's return type as an argument. This makes it possible to add +Microsoft-style linkage keywords to all the routines by changing just +these macros. Note that any application code that was using these macros +will have to be changed. + +DCT coefficient quantization tables are now stored in normal array order +rather than zigzag order. Application code that calls jpeg_add_quant_table, +or otherwise manipulates quantization tables directly, will need to be +changed. If you need to make such code work with either older or newer +versions of the library, a test like "#if JPEG_LIB_VERSION >= 61" is +recommended. + +djpeg's trace capability now dumps DQT tables in natural order, not zigzag +order. This allows the trace output to be made into a "-qtables" file +more easily. + +New system-dependent memory manager module for use on Apple Macintosh. + +Fix bug in cjpeg's -smooth option: last one or two scanlines would be +duplicates of the prior line unless the image height mod 16 was 1 or 2. + +Repair minor problems in VMS, BCC, MC6 makefiles. + +New configure script based on latest GNU Autoconf. + +Correct the list of include files needed by MetroWerks C for ccommand(). + +Numerous small documentation updates. + + +Version 6 2-Aug-95 +------------------- + +Progressive JPEG support: library can read and write full progressive JPEG +files. A "buffered image" mode supports incremental decoding for on-the-fly +display of progressive images. Simply recompiling an existing IJG-v5-based +decoder with v6 should allow it to read progressive files, though of course +without any special progressive display. + +New "jpegtran" application performs lossless transcoding between different +JPEG formats; primarily, it can be used to convert baseline to progressive +JPEG and vice versa. In support of jpegtran, the library now allows lossless +reading and writing of JPEG files as DCT coefficient arrays. This ability +may be of use in other applications. + +Notes for programmers: +* We changed jpeg_start_decompress() to be able to suspend; this makes all +decoding modes available to suspending-input applications. However, +existing applications that use suspending input will need to be changed +to check the return value from jpeg_start_decompress(). You don't need to +do anything if you don't use a suspending data source. +* We changed the interface to the virtual array routines: access_virt_array +routines now take a count of the number of rows to access this time. The +last parameter to request_virt_array routines is now interpreted as the +maximum number of rows that may be accessed at once, but not necessarily +the height of every access. + + +Version 5b 15-Mar-95 +--------------------- + +Correct bugs with grayscale images having v_samp_factor > 1. + +jpeg_write_raw_data() now supports output suspension. + +Correct bugs in "configure" script for case of compiling in +a directory other than the one containing the source files. + +Repair bug in jquant1.c: sometimes didn't use as many colors as it could. + +Borland C makefile and jconfig file work under either MS-DOS or OS/2. + +Miscellaneous improvements to documentation. + + +Version 5a 7-Dec-94 +-------------------- + +Changed color conversion roundoff behavior so that grayscale values are +represented exactly. (This causes test image files to change.) + +Make ordered dither use 16x16 instead of 4x4 pattern for a small quality +improvement. + +New configure script based on latest GNU Autoconf. +Fix configure script to handle CFLAGS correctly. +Rename *.auto files to *.cfg, so that configure script still works if +file names have been truncated for DOS. + +Fix bug in rdbmp.c: didn't allow for extra data between header and image. + +Modify rdppm.c/wrppm.c to handle 2-byte raw PPM/PGM formats for 12-bit data. + +Fix several bugs in rdrle.c. + +NEED_SHORT_EXTERNAL_NAMES option was broken. + +Revise jerror.h/jerror.c for more flexibility in message table. + +Repair oversight in jmemname.c NO_MKTEMP case: file could be there +but unreadable. + + +Version 5 24-Sep-94 +-------------------- + +Version 5 represents a nearly complete redesign and rewrite of the IJG +software. Major user-visible changes include: + * Automatic configuration simplifies installation for most Unix systems. + * A range of speed vs. image quality tradeoffs are supported. + This includes resizing of an image during decompression: scaling down + by a factor of 1/2, 1/4, or 1/8 is handled very efficiently. + * New programs rdjpgcom and wrjpgcom allow insertion and extraction + of text comments in a JPEG file. + +The application programmer's interface to the library has changed completely. +Notable improvements include: + * We have eliminated the use of callback routines for handling the + uncompressed image data. The application now sees the library as a + set of routines that it calls to read or write image data on a + scanline-by-scanline basis. + * The application image data is represented in a conventional interleaved- + pixel format, rather than as a separate array for each color channel. + This can save a copying step in many programs. + * The handling of compressed data has been cleaned up: the application can + supply routines to source or sink the compressed data. It is possible to + suspend processing on source/sink buffer overrun, although this is not + supported in all operating modes. + * All static state has been eliminated from the library, so that multiple + instances of compression or decompression can be active concurrently. + * JPEG abbreviated datastream formats are supported, ie, quantization and + Huffman tables can be stored separately from the image data. + * And not only that, but the documentation of the library has improved + considerably! + + +The last widely used release before the version 5 rewrite was version 4A of +18-Feb-93. Change logs before that point have been discarded, since they +are not of much interest after the rewrite. diff --git a/jpeg-8c/cjpeg b/jpeg-8c/cjpeg new file mode 100755 index 00000000..66855417 --- /dev/null +++ b/jpeg-8c/cjpeg @@ -0,0 +1,225 @@ +#! /bin/bash + +# cjpeg - temporary wrapper script for .libs/cjpeg +# Generated by libtool (GNU libtool) 2.4 +# +# The cjpeg program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command="(cd /home/www/proj/jpeg-8c; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH; gcc -std=gnu99 -g -O2 -o \$progdir/\$file cjpeg.o rdppm.o rdgif.o rdtarga.o rdrle.o rdbmp.o rdswitch.o cdjpeg.o ./.libs/libjpeg.so -Wl,-rpath -Wl,/home/www/proj/jpeg-8c/.libs)" + +# This environment variable determines our operation mode. +if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then + # install mode needs the following variables: + generated_by_libtool_version='2.4' + notinst_deplibs=' libjpeg.la' +else + # When we are sourced in execute mode, $file and $ECHO are already set. + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + file="$0" + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + ECHO="printf %s\\n" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string --lt- +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's ./libtool value, followed by no. +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=$0 + shift + for lt_opt + do + case "$lt_opt" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'` + test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=. + lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'` + cat "$lt_dump_D/$lt_dump_F" + exit 0 + ;; + --lt-*) + $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n "$lt_option_debug"; then + echo "cjpeg:cjpeg:${LINENO}: libtool wrapper (GNU libtool) 2.4" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + $ECHO "cjpeg:cjpeg:${LINENO}: newargv[$lt_dump_args_N]: $lt_arg" + lt_dump_args_N=`expr $lt_dump_args_N + 1` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ + + if test -n "$lt_option_debug"; then + $ECHO "cjpeg:cjpeg:${LINENO}: newargv[0]: $progdir/$program" 1>&2 + func_lt_dump_args ${1+"$@"} 1>&2 + fi + exec "$progdir/$program" ${1+"$@"} + + $ECHO "$0: cannot exec $program $*" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from $@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + for lt_wr_arg + do + case $lt_wr_arg in + --lt-*) ;; + *) set x "$@" "$lt_wr_arg"; shift;; + esac + shift + done + func_exec_program_core ${1+"$@"} +} + + # Parse options + func_parse_lt_options "$0" ${1+"$@"} + + # Find the directory that this script lives in. + thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'` + test "x$thisdir" = "x$file" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'` + while test -n "$file"; do + destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'` + + # If there was a directory component, then change thisdir. + if test "x$destdir" != "x$file"; then + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;; + *) thisdir="$thisdir/$destdir" ;; + esac + fi + + file=`$ECHO "$file" | /bin/sed 's%^.*/%%'` + file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no + if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then + # special case for '.' + if test "$thisdir" = "."; then + thisdir=`pwd` + fi + # remove .libs from thisdir + case "$thisdir" in + *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;; + .libs ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=`cd "$thisdir" && pwd` + test -n "$absdir" && thisdir="$absdir" + + program=lt-'cjpeg' + progdir="$thisdir/.libs" + + if test ! -f "$progdir/$program" || + { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \ + test "X$file" != "X$progdir/$program"; }; then + + file="$$-$program" + + if test ! -d "$progdir"; then + mkdir "$progdir" + else + rm -f "$progdir/$file" + fi + + # relink executable if necessary + if test -n "$relink_command"; then + if relink_command_output=`eval $relink_command 2>&1`; then : + else + printf %s\n "$relink_command_output" >&2 + rm -f "$progdir/$file" + exit 1 + fi + fi + + mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null || + { rm -f "$progdir/$program"; + mv -f "$progdir/$file" "$progdir/$program"; } + rm -f "$progdir/$file" + fi + + if test -f "$progdir/$program"; then + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + # Run the actual program with our arguments. + func_exec_program ${1+"$@"} + fi + else + # The program doesn't exist. + $ECHO "$0: error: \`$progdir/$program' does not exist" 1>&2 + $ECHO "This script is just a wrapper for $program." 1>&2 + $ECHO "See the libtool documentation for more information." 1>&2 + exit 1 + fi +fi diff --git a/jpeg-8c/cjpeg.1 b/jpeg-8c/cjpeg.1 new file mode 100644 index 00000000..d50bf809 --- /dev/null +++ b/jpeg-8c/cjpeg.1 @@ -0,0 +1,339 @@ +.TH CJPEG 1 "14 November 2010" +.SH NAME +cjpeg \- compress an image file to a JPEG file +.SH SYNOPSIS +.B cjpeg +[ +.I options +] +[ +.I filename +] +.LP +.SH DESCRIPTION +.LP +.B cjpeg +compresses the named image file, or the standard input if no file is +named, and produces a JPEG/JFIF file on the standard output. +The currently supported input file formats are: PPM (PBMPLUS color +format), PGM (PBMPLUS gray-scale format), BMP, Targa, and RLE (Utah Raster +Toolkit format). (RLE is supported only if the URT library is available.) +.SH OPTIONS +All switch names may be abbreviated; for example, +.B \-grayscale +may be written +.B \-gray +or +.BR \-gr . +Most of the "basic" switches can be abbreviated to as little as one letter. +Upper and lower case are equivalent (thus +.B \-BMP +is the same as +.BR \-bmp ). +British spellings are also accepted (e.g., +.BR \-greyscale ), +though for brevity these are not mentioned below. +.PP +The basic switches are: +.TP +.BI \-quality " N[,...]" +Scale quantization tables to adjust image quality. Quality is 0 (worst) to +100 (best); default is 75. (See below for more info.) +.TP +.B \-grayscale +Create monochrome JPEG file from color input. Be sure to use this switch when +compressing a grayscale BMP file, because +.B cjpeg +isn't bright enough to notice whether a BMP file uses only shades of gray. +By saying +.BR \-grayscale , +you'll get a smaller JPEG file that takes less time to process. +.TP +.B \-optimize +Perform optimization of entropy encoding parameters. Without this, default +encoding parameters are used. +.B \-optimize +usually makes the JPEG file a little smaller, but +.B cjpeg +runs somewhat slower and needs much more memory. Image quality and speed of +decompression are unaffected by +.BR \-optimize . +.TP +.B \-progressive +Create progressive JPEG file (see below). +.TP +.BI \-scale " M/N" +Scale the output image by a factor M/N. Currently supported scale factors are +M/N with all N from 1 to 16, where M is the destination DCT size, which is 8 +by default (see +.BI \-block " N" +switch below). +.TP +.B \-targa +Input file is Targa format. Targa files that contain an "identification" +field will not be automatically recognized by +.BR cjpeg ; +for such files you must specify +.B \-targa +to make +.B cjpeg +treat the input as Targa format. +For most Targa files, you won't need this switch. +.PP +The +.B \-quality +switch lets you trade off compressed file size against quality of the +reconstructed image: the higher the quality setting, the larger the JPEG file, +and the closer the output image will be to the original input. Normally you +want to use the lowest quality setting (smallest file) that decompresses into +something visually indistinguishable from the original image. For this +purpose the quality setting should be between 50 and 95; the default of 75 is +often about right. If you see defects at +.B \-quality +75, then go up 5 or 10 counts at a time until you are happy with the output +image. (The optimal setting will vary from one image to another.) +.PP +.B \-quality +100 will generate a quantization table of all 1's, minimizing loss in the +quantization step (but there is still information loss in subsampling, as well +as roundoff error). This setting is mainly of interest for experimental +purposes. Quality values above about 95 are +.B not +recommended for normal use; the compressed file size goes up dramatically for +hardly any gain in output image quality. +.PP +In the other direction, quality values below 50 will produce very small files +of low image quality. Settings around 5 to 10 might be useful in preparing an +index of a large image library, for example. Try +.B \-quality +2 (or so) for some amusing Cubist effects. (Note: quality +values below about 25 generate 2-byte quantization tables, which are +considered optional in the JPEG standard. +.B cjpeg +emits a warning message when you give such a quality value, because some +other JPEG programs may be unable to decode the resulting file. Use +.B \-baseline +if you need to ensure compatibility at low quality values.) +.PP +The +.B \-quality +option has been extended in IJG version 7 for support of separate quality +settings for luminance and chrominance (or in general, for every provided +quantization table slot). This feature is useful for high-quality +applications which cannot accept the damage of color data by coarse +subsampling settings. You can now easily reduce the color data amount more +smoothly with finer control without separate subsampling. The resulting file +is fully compliant with standard JPEG decoders. +Note that the +.B \-quality +ratings refer to the quantization table slots, and that the last value is +replicated if there are more q-table slots than parameters. The default +q-table slots are 0 for luminance and 1 for chrominance with default tables as +given in the JPEG standard. This is compatible with the old behaviour in case +that only one parameter is given, which is then used for both luminance and +chrominance (slots 0 and 1). More or custom quantization tables can be set +with +.B \-qtables +and assigned to components with +.B \-qslots +parameter (see the "wizard" switches below). +.B Caution: +You must explicitly add +.BI \-sample " 1x1" +for efficient separate color +quality selection, since the default value used by library is 2x2! +.PP +The +.B \-progressive +switch creates a "progressive JPEG" file. In this type of JPEG file, the data +is stored in multiple scans of increasing quality. If the file is being +transmitted over a slow communications link, the decoder can use the first +scan to display a low-quality image very quickly, and can then improve the +display with each subsequent scan. The final image is exactly equivalent to a +standard JPEG file of the same quality setting, and the total file size is +about the same --- often a little smaller. +.PP +Switches for advanced users: +.TP +.BI \-block " N" +Set DCT block size. All N from 1 to 16 are possible. +Default is 8 (baseline format). +Larger values produce higher compression, +smaller values produce higher quality +(exact DCT stage possible with 1 or 2; with the default quality of 75 and +default Luminance qtable the DCT+Quantization stage is lossless for N=1). +CAUTION: An implementation of the JPEG SmartScale extension is required for +this feature. SmartScale enabled JPEG is not yet widely implemented, so +many decoders will be unable to view a SmartScale extended JPEG file at all. +.TP +.B \-dct int +Use integer DCT method (default). +.TP +.B \-dct fast +Use fast integer DCT (less accurate). +.TP +.B \-dct float +Use floating-point DCT method. +The float method is very slightly more accurate than the int method, but is +much slower unless your machine has very fast floating-point hardware. Also +note that results of the floating-point method may vary slightly across +machines, while the integer methods should give the same results everywhere. +The fast integer method is much less accurate than the other two. +.TP +.B \-nosmooth +Don't use high-quality downsampling. +.TP +.BI \-restart " N" +Emit a JPEG restart marker every N MCU rows, or every N MCU blocks if "B" is +attached to the number. +.B \-restart 0 +(the default) means no restart markers. +.TP +.BI \-smooth " N" +Smooth the input image to eliminate dithering noise. N, ranging from 1 to +100, indicates the strength of smoothing. 0 (the default) means no smoothing. +.TP +.BI \-maxmemory " N" +Set limit for amount of memory to use in processing large images. Value is +in thousands of bytes, or millions of bytes if "M" is attached to the +number. For example, +.B \-max 4m +selects 4000000 bytes. If more space is needed, temporary files will be used. +.TP +.BI \-outfile " name" +Send output image to the named file, not to standard output. +.TP +.B \-verbose +Enable debug printout. More +.BR \-v 's +give more output. Also, version information is printed at startup. +.TP +.B \-debug +Same as +.BR \-verbose . +.PP +The +.B \-restart +option inserts extra markers that allow a JPEG decoder to resynchronize after +a transmission error. Without restart markers, any damage to a compressed +file will usually ruin the image from the point of the error to the end of the +image; with restart markers, the damage is usually confined to the portion of +the image up to the next restart marker. Of course, the restart markers +occupy extra space. We recommend +.B \-restart 1 +for images that will be transmitted across unreliable networks such as Usenet. +.PP +The +.B \-smooth +option filters the input to eliminate fine-scale noise. This is often useful +when converting dithered images to JPEG: a moderate smoothing factor of 10 to +50 gets rid of dithering patterns in the input file, resulting in a smaller +JPEG file and a better-looking image. Too large a smoothing factor will +visibly blur the image, however. +.PP +Switches for wizards: +.TP +.B \-arithmetic +Use arithmetic coding. +.B Caution: +arithmetic coded JPEG is not yet widely implemented, so many decoders will be +unable to view an arithmetic coded JPEG file at all. +.TP +.B \-baseline +Force baseline-compatible quantization tables to be generated. This clamps +quantization values to 8 bits even at low quality settings. (This switch is +poorly named, since it does not ensure that the output is actually baseline +JPEG. For example, you can use +.B \-baseline +and +.B \-progressive +together.) +.TP +.BI \-qtables " file" +Use the quantization tables given in the specified text file. +.TP +.BI \-qslots " N[,...]" +Select which quantization table to use for each color component. +.TP +.BI \-sample " HxV[,...]" +Set JPEG sampling factors for each color component. +.TP +.BI \-scans " file" +Use the scan script given in the specified text file. +.PP +The "wizard" switches are intended for experimentation with JPEG. If you +don't know what you are doing, \fBdon't use them\fR. These switches are +documented further in the file wizard.txt. +.SH EXAMPLES +.LP +This example compresses the PPM file foo.ppm with a quality factor of +60 and saves the output as foo.jpg: +.IP +.B cjpeg \-quality +.I 60 foo.ppm +.B > +.I foo.jpg +.SH HINTS +Color GIF files are not the ideal input for JPEG; JPEG is really intended for +compressing full-color (24-bit) images. In particular, don't try to convert +cartoons, line drawings, and other images that have only a few distinct +colors. GIF works great on these, JPEG does not. If you want to convert a +GIF to JPEG, you should experiment with +.BR cjpeg 's +.B \-quality +and +.B \-smooth +options to get a satisfactory conversion. +.B \-smooth 10 +or so is often helpful. +.PP +Avoid running an image through a series of JPEG compression/decompression +cycles. Image quality loss will accumulate; after ten or so cycles the image +may be noticeably worse than it was after one cycle. It's best to use a +lossless format while manipulating an image, then convert to JPEG format when +you are ready to file the image away. +.PP +The +.B \-optimize +option to +.B cjpeg +is worth using when you are making a "final" version for posting or archiving. +It's also a win when you are using low quality settings to make very small +JPEG files; the percentage improvement is often a lot more than it is on +larger files. (At present, +.B \-optimize +mode is always selected when generating progressive JPEG files.) +.SH ENVIRONMENT +.TP +.B JPEGMEM +If this environment variable is set, its value is the default memory limit. +The value is specified as described for the +.B \-maxmemory +switch. +.B JPEGMEM +overrides the default value specified when the program was compiled, and +itself is overridden by an explicit +.BR \-maxmemory . +.SH SEE ALSO +.BR djpeg (1), +.BR jpegtran (1), +.BR rdjpgcom (1), +.BR wrjpgcom (1) +.br +.BR ppm (5), +.BR pgm (5) +.br +Wallace, Gregory K. "The JPEG Still Picture Compression Standard", +Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44. +.SH AUTHOR +Independent JPEG Group +.SH BUGS +GIF input files are no longer supported, to avoid the Unisys LZW patent. +(Conversion of GIF files to JPEG is usually a bad idea anyway.) +.PP +Not all variants of BMP and Targa file formats are supported. +.PP +The +.B \-targa +switch is not a bug, it's a feature. (It would be a bug if the Targa format +designers had not been clueless.) diff --git a/jpeg-8c/cjpeg.c b/jpeg-8c/cjpeg.c new file mode 100644 index 00000000..40d25215 --- /dev/null +++ b/jpeg-8c/cjpeg.c @@ -0,0 +1,639 @@ +/* + * cjpeg.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2003-2010 by Guido Vollbeding. + * 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 command-line user interface for the JPEG compressor. + * It should work on any system with Unix- or MS-DOS-style command lines. + * + * Two different command line styles are permitted, depending on the + * compile-time switch TWO_FILE_COMMANDLINE: + * cjpeg [options] inputfile outputfile + * cjpeg [options] [inputfile] + * In the second style, output is always to standard output, which you'd + * normally redirect to a file or pipe to some other program. Input is + * either from a named file or from standard input (typically redirected). + * The second style is convenient on Unix but is unhelpful on systems that + * don't support pipes. Also, you MUST use the first style if your system + * doesn't do binary I/O to stdin/stdout. + * To simplify script writing, the "-outfile" switch is provided. The syntax + * cjpeg [options] -outfile outputfile inputfile + * works regardless of which command line style is used. + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ +#include "jversion.h" /* for version message */ + +#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ +#ifdef __MWERKS__ +#include /* Metrowerks needs this */ +#include /* ... and this */ +#endif +#ifdef THINK_C +#include /* Think declares it here */ +#endif +#endif + + +/* Create the add-on message string table. */ + +#define JMESSAGE(code,string) string , + +static const char * const cdjpeg_message_table[] = { +#include "cderror.h" + NULL +}; + + +/* + * This routine determines what format the input file is, + * and selects the appropriate input-reading module. + * + * To determine which family of input formats the file belongs to, + * we may look only at the first byte of the file, since C does not + * guarantee that more than one character can be pushed back with ungetc. + * Looking at additional bytes would require one of these approaches: + * 1) assume we can fseek() the input file (fails for piped input); + * 2) assume we can push back more than one character (works in + * some C implementations, but unportable); + * 3) provide our own buffering (breaks input readers that want to use + * stdio directly, such as the RLE library); + * or 4) don't put back the data, and modify the input_init methods to assume + * they start reading after the start of file (also breaks RLE library). + * #1 is attractive for MS-DOS but is untenable on Unix. + * + * The most portable solution for file types that can't be identified by their + * first byte is to make the user tell us what they are. This is also the + * only approach for "raw" file types that contain only arbitrary values. + * We presently apply this method for Targa files. Most of the time Targa + * files start with 0x00, so we recognize that case. Potentially, however, + * a Targa file could start with any byte value (byte 0 is the length of the + * seldom-used ID field), so we provide a switch to force Targa input mode. + */ + +static boolean is_targa; /* records user -targa switch */ + + +LOCAL(cjpeg_source_ptr) +select_file_type (j_compress_ptr cinfo, FILE * infile) +{ + int c; + + if (is_targa) { +#ifdef TARGA_SUPPORTED + return jinit_read_targa(cinfo); +#else + ERREXIT(cinfo, JERR_TGA_NOTCOMP); +#endif + } + + if ((c = getc(infile)) == EOF) + ERREXIT(cinfo, JERR_INPUT_EMPTY); + if (ungetc(c, infile) == EOF) + ERREXIT(cinfo, JERR_UNGETC_FAILED); + + switch (c) { +#ifdef BMP_SUPPORTED + case 'B': + return jinit_read_bmp(cinfo); +#endif +#ifdef GIF_SUPPORTED + case 'G': + return jinit_read_gif(cinfo); +#endif +#ifdef PPM_SUPPORTED + case 'P': + return jinit_read_ppm(cinfo); +#endif +#ifdef RLE_SUPPORTED + case 'R': + return jinit_read_rle(cinfo); +#endif +#ifdef TARGA_SUPPORTED + case 0x00: + return jinit_read_targa(cinfo); +#endif + default: + ERREXIT(cinfo, JERR_UNKNOWN_FORMAT); + break; + } + + return NULL; /* suppress compiler warnings */ +} + + +/* + * Argument-parsing code. + * The switch parser is designed to be useful with DOS-style command line + * syntax, ie, intermixed switches and file names, where only the switches + * to the left of a given file name affect processing of that file. + * The main program in this file doesn't actually use this capability... + */ + + +static const char * progname; /* program name for error messages */ +static char * outfilename; /* for -outfile switch */ + + +LOCAL(void) +usage (void) +/* complain about bad command line */ +{ + fprintf(stderr, "usage: %s [switches] ", progname); +#ifdef TWO_FILE_COMMANDLINE + fprintf(stderr, "inputfile outputfile\n"); +#else + fprintf(stderr, "[inputfile]\n"); +#endif + + fprintf(stderr, "Switches (names may be abbreviated):\n"); + fprintf(stderr, " -quality N[,...] Compression quality (0..100; 5-95 is useful range)\n"); + fprintf(stderr, " -grayscale Create monochrome JPEG file\n"); +#ifdef ENTROPY_OPT_SUPPORTED + fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n"); +#endif +#ifdef C_PROGRESSIVE_SUPPORTED + fprintf(stderr, " -progressive Create progressive JPEG file\n"); +#endif +#ifdef DCT_SCALING_SUPPORTED + fprintf(stderr, " -scale M/N Scale image by fraction M/N, eg, 1/2\n"); +#endif +#ifdef TARGA_SUPPORTED + fprintf(stderr, " -targa Input file is Targa format (usually not needed)\n"); +#endif + fprintf(stderr, "Switches for advanced users:\n"); +#ifdef DCT_SCALING_SUPPORTED + fprintf(stderr, " -block N DCT block size (1..16; default is 8)\n"); +#endif +#ifdef DCT_ISLOW_SUPPORTED + fprintf(stderr, " -dct int Use integer DCT method%s\n", + (JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : "")); +#endif +#ifdef DCT_IFAST_SUPPORTED + fprintf(stderr, " -dct fast Use fast integer DCT (less accurate)%s\n", + (JDCT_DEFAULT == JDCT_IFAST ? " (default)" : "")); +#endif +#ifdef DCT_FLOAT_SUPPORTED + fprintf(stderr, " -dct float Use floating-point DCT method%s\n", + (JDCT_DEFAULT == JDCT_FLOAT ? " (default)" : "")); +#endif + fprintf(stderr, " -nosmooth Don't use high-quality downsampling\n"); + fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n"); +#ifdef INPUT_SMOOTHING_SUPPORTED + fprintf(stderr, " -smooth N Smooth dithered input (N=1..100 is strength)\n"); +#endif + fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n"); + fprintf(stderr, " -outfile name Specify name for output file\n"); + fprintf(stderr, " -verbose or -debug Emit debug output\n"); + fprintf(stderr, "Switches for wizards:\n"); +#ifdef C_ARITH_CODING_SUPPORTED + fprintf(stderr, " -arithmetic Use arithmetic coding\n"); +#endif + fprintf(stderr, " -baseline Force baseline quantization tables\n"); + fprintf(stderr, " -qtables file Use quantization tables given in file\n"); + fprintf(stderr, " -qslots N[,...] Set component quantization tables\n"); + fprintf(stderr, " -sample HxV[,...] Set component sampling factors\n"); +#ifdef C_MULTISCAN_FILES_SUPPORTED + fprintf(stderr, " -scans file Create multi-scan JPEG per script file\n"); +#endif + exit(EXIT_FAILURE); +} + + +LOCAL(int) +parse_switches (j_compress_ptr cinfo, int argc, char **argv, + int last_file_arg_seen, boolean for_real) +/* Parse optional switches. + * Returns argv[] index of first file-name argument (== argc if none). + * Any file names with indexes <= last_file_arg_seen are ignored; + * they have presumably been processed in a previous iteration. + * (Pass 0 for last_file_arg_seen on the first or only iteration.) + * for_real is FALSE on the first (dummy) pass; we may skip any expensive + * processing. + */ +{ + int argn; + char * arg; + boolean force_baseline; + boolean simple_progressive; + char * qualityarg = NULL; /* saves -quality parm if any */ + char * qtablefile = NULL; /* saves -qtables filename if any */ + char * qslotsarg = NULL; /* saves -qslots parm if any */ + char * samplearg = NULL; /* saves -sample parm if any */ + char * scansarg = NULL; /* saves -scans parm if any */ + + /* Set up default JPEG parameters. */ + + force_baseline = FALSE; /* by default, allow 16-bit quantizers */ + simple_progressive = FALSE; + is_targa = FALSE; + outfilename = NULL; + cinfo->err->trace_level = 0; + + /* Scan command line options, adjust parameters */ + + for (argn = 1; argn < argc; argn++) { + arg = argv[argn]; + if (*arg != '-') { + /* Not a switch, must be a file name argument */ + if (argn <= last_file_arg_seen) { + outfilename = NULL; /* -outfile applies to just one input file */ + continue; /* ignore this name if previously processed */ + } + break; /* else done parsing switches */ + } + arg++; /* advance past switch marker character */ + + if (keymatch(arg, "arithmetic", 1)) { + /* Use arithmetic coding. */ +#ifdef C_ARITH_CODING_SUPPORTED + cinfo->arith_code = TRUE; +#else + fprintf(stderr, "%s: sorry, arithmetic coding not supported\n", + progname); + exit(EXIT_FAILURE); +#endif + + } else if (keymatch(arg, "baseline", 2)) { + /* Force baseline-compatible output (8-bit quantizer values). */ + force_baseline = TRUE; + + } else if (keymatch(arg, "block", 2)) { + /* Set DCT block size. */ +#if defined(DCT_SCALING_SUPPORTED) && defined(JPEG_LIB_VERSION_MAJOR) && \ + (JPEG_LIB_VERSION_MAJOR > 8 || (JPEG_LIB_VERSION_MAJOR == 8 && \ + defined(JPEG_LIB_VERSION_MINOR) && JPEG_LIB_VERSION_MINOR >= 3)) + int val; + + if (++argn >= argc) /* advance to next argument */ + usage(); + if (sscanf(argv[argn], "%d", &val) != 1) + usage(); + if (val < 1 || val > 16) + usage(); + cinfo->block_size = val; +#else + fprintf(stderr, "%s: sorry, block size setting not supported\n", + progname); + exit(EXIT_FAILURE); +#endif + + } else if (keymatch(arg, "dct", 2)) { + /* Select DCT algorithm. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + if (keymatch(argv[argn], "int", 1)) { + cinfo->dct_method = JDCT_ISLOW; + } else if (keymatch(argv[argn], "fast", 2)) { + cinfo->dct_method = JDCT_IFAST; + } else if (keymatch(argv[argn], "float", 2)) { + cinfo->dct_method = JDCT_FLOAT; + } else + usage(); + + } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { + /* Enable debug printouts. */ + /* On first -d, print version identification */ + static boolean printed_version = FALSE; + + if (! printed_version) { + fprintf(stderr, "Independent JPEG Group's CJPEG, version %s\n%s\n", + JVERSION, JCOPYRIGHT); + printed_version = TRUE; + } + cinfo->err->trace_level++; + + } else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) { + /* Force a monochrome JPEG file to be generated. */ + jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); + + } else if (keymatch(arg, "maxmemory", 3)) { + /* Maximum memory in Kb (or Mb with 'm'). */ + long lval; + char ch = 'x'; + + if (++argn >= argc) /* advance to next argument */ + usage(); + if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) + usage(); + if (ch == 'm' || ch == 'M') + lval *= 1000L; + cinfo->mem->max_memory_to_use = lval * 1000L; + + } else if (keymatch(arg, "nosmooth", 3)) { + /* Suppress fancy downsampling */ + cinfo->do_fancy_downsampling = FALSE; + + } else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) { + /* Enable entropy parm optimization. */ +#ifdef ENTROPY_OPT_SUPPORTED + cinfo->optimize_coding = TRUE; +#else + fprintf(stderr, "%s: sorry, entropy optimization was not compiled\n", + progname); + exit(EXIT_FAILURE); +#endif + + } else if (keymatch(arg, "outfile", 4)) { + /* Set output file name. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + outfilename = argv[argn]; /* save it away for later use */ + + } else if (keymatch(arg, "progressive", 1)) { + /* Select simple progressive mode. */ +#ifdef C_PROGRESSIVE_SUPPORTED + simple_progressive = TRUE; + /* We must postpone execution until num_components is known. */ +#else + fprintf(stderr, "%s: sorry, progressive output was not compiled\n", + progname); + exit(EXIT_FAILURE); +#endif + + } else if (keymatch(arg, "quality", 1)) { + /* Quality ratings (quantization table scaling factors). */ + if (++argn >= argc) /* advance to next argument */ + usage(); + qualityarg = argv[argn]; + + } else if (keymatch(arg, "qslots", 2)) { + /* Quantization table slot numbers. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + qslotsarg = argv[argn]; + /* Must delay setting qslots until after we have processed any + * colorspace-determining switches, since jpeg_set_colorspace sets + * default quant table numbers. + */ + + } else if (keymatch(arg, "qtables", 2)) { + /* Quantization tables fetched from file. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + qtablefile = argv[argn]; + /* We postpone actually reading the file in case -quality comes later. */ + + } else if (keymatch(arg, "restart", 1)) { + /* Restart interval in MCU rows (or in MCUs with 'b'). */ + long lval; + char ch = 'x'; + + if (++argn >= argc) /* advance to next argument */ + usage(); + if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) + usage(); + if (lval < 0 || lval > 65535L) + usage(); + if (ch == 'b' || ch == 'B') { + cinfo->restart_interval = (unsigned int) lval; + cinfo->restart_in_rows = 0; /* else prior '-restart n' overrides me */ + } else { + cinfo->restart_in_rows = (int) lval; + /* restart_interval will be computed during startup */ + } + + } else if (keymatch(arg, "sample", 2)) { + /* Set sampling factors. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + samplearg = argv[argn]; + /* Must delay setting sample factors until after we have processed any + * colorspace-determining switches, since jpeg_set_colorspace sets + * default sampling factors. + */ + + } else if (keymatch(arg, "scale", 4)) { + /* Scale the image by a fraction M/N. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + if (sscanf(argv[argn], "%d/%d", + &cinfo->scale_num, &cinfo->scale_denom) != 2) + usage(); + + } else if (keymatch(arg, "scans", 4)) { + /* Set scan script. */ +#ifdef C_MULTISCAN_FILES_SUPPORTED + if (++argn >= argc) /* advance to next argument */ + usage(); + scansarg = argv[argn]; + /* We must postpone reading the file in case -progressive appears. */ +#else + fprintf(stderr, "%s: sorry, multi-scan output was not compiled\n", + progname); + exit(EXIT_FAILURE); +#endif + + } else if (keymatch(arg, "smooth", 2)) { + /* Set input smoothing factor. */ + int val; + + if (++argn >= argc) /* advance to next argument */ + usage(); + if (sscanf(argv[argn], "%d", &val) != 1) + usage(); + if (val < 0 || val > 100) + usage(); + cinfo->smoothing_factor = val; + + } else if (keymatch(arg, "targa", 1)) { + /* Input file is Targa format. */ + is_targa = TRUE; + + } else { + usage(); /* bogus switch */ + } + } + + /* Post-switch-scanning cleanup */ + + if (for_real) { + + /* Set quantization tables for selected quality. */ + /* Some or all may be overridden if -qtables is present. */ + if (qualityarg != NULL) /* process -quality if it was present */ + if (! set_quality_ratings(cinfo, qualityarg, force_baseline)) + usage(); + + if (qtablefile != NULL) /* process -qtables if it was present */ + if (! read_quant_tables(cinfo, qtablefile, force_baseline)) + usage(); + + if (qslotsarg != NULL) /* process -qslots if it was present */ + if (! set_quant_slots(cinfo, qslotsarg)) + usage(); + + if (samplearg != NULL) /* process -sample if it was present */ + if (! set_sample_factors(cinfo, samplearg)) + usage(); + +#ifdef C_PROGRESSIVE_SUPPORTED + if (simple_progressive) /* process -progressive; -scans can override */ + jpeg_simple_progression(cinfo); +#endif + +#ifdef C_MULTISCAN_FILES_SUPPORTED + if (scansarg != NULL) /* process -scans if it was present */ + if (! read_scan_script(cinfo, scansarg)) + usage(); +#endif + } + + return argn; /* return index of next arg (file name) */ +} + + +/* + * The main program. + */ + +int +main (int argc, char **argv) +{ + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; +#ifdef PROGRESS_REPORT + struct cdjpeg_progress_mgr progress; +#endif + int file_index; + cjpeg_source_ptr src_mgr; + FILE * input_file; + FILE * output_file; + JDIMENSION num_scanlines; + + /* On Mac, fetch a command line. */ +#ifdef USE_CCOMMAND + argc = ccommand(&argv); +#endif + + progname = argv[0]; + if (progname == NULL || progname[0] == 0) + progname = "cjpeg"; /* in case C library doesn't provide it */ + + /* Initialize the JPEG compression object with default error handling. */ + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_compress(&cinfo); + /* Add some application-specific error messages (from cderror.h) */ + jerr.addon_message_table = cdjpeg_message_table; + jerr.first_addon_message = JMSG_FIRSTADDONCODE; + jerr.last_addon_message = JMSG_LASTADDONCODE; + + /* Now safe to enable signal catcher. */ +#ifdef NEED_SIGNAL_CATCHER + enable_signal_catcher((j_common_ptr) &cinfo); +#endif + + /* Initialize JPEG parameters. + * Much of this may be overridden later. + * In particular, we don't yet know the input file's color space, + * but we need to provide some value for jpeg_set_defaults() to work. + */ + + cinfo.in_color_space = JCS_RGB; /* arbitrary guess */ + jpeg_set_defaults(&cinfo); + + /* Scan command line to find file names. + * It is convenient to use just one switch-parsing routine, but the switch + * values read here are ignored; we will rescan the switches after opening + * the input file. + */ + + file_index = parse_switches(&cinfo, argc, argv, 0, FALSE); + +#ifdef TWO_FILE_COMMANDLINE + /* Must have either -outfile switch or explicit output file name */ + if (outfilename == NULL) { + if (file_index != argc-2) { + fprintf(stderr, "%s: must name one input and one output file\n", + progname); + usage(); + } + outfilename = argv[file_index+1]; + } else { + if (file_index != argc-1) { + fprintf(stderr, "%s: must name one input and one output file\n", + progname); + usage(); + } + } +#else + /* Unix style: expect zero or one file name */ + if (file_index < argc-1) { + fprintf(stderr, "%s: only one input file\n", progname); + usage(); + } +#endif /* TWO_FILE_COMMANDLINE */ + + /* Open the input file. */ + if (file_index < argc) { + if ((input_file = fopen(argv[file_index], READ_BINARY)) == NULL) { + fprintf(stderr, "%s: can't open %s\n", progname, argv[file_index]); + exit(EXIT_FAILURE); + } + } else { + /* default input file is stdin */ + input_file = read_stdin(); + } + + /* Open the output file. */ + if (outfilename != NULL) { + if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) { + fprintf(stderr, "%s: can't open %s\n", progname, outfilename); + exit(EXIT_FAILURE); + } + } else { + /* default output file is stdout */ + output_file = write_stdout(); + } + +#ifdef PROGRESS_REPORT + start_progress_monitor((j_common_ptr) &cinfo, &progress); +#endif + + /* Figure out the input file format, and set up to read it. */ + src_mgr = select_file_type(&cinfo, input_file); + src_mgr->input_file = input_file; + + /* Read the input file header to obtain file size & colorspace. */ + (*src_mgr->start_input) (&cinfo, src_mgr); + + /* Now that we know input colorspace, fix colorspace-dependent defaults */ + jpeg_default_colorspace(&cinfo); + + /* Adjust default compression parameters by re-parsing the options */ + file_index = parse_switches(&cinfo, argc, argv, 0, TRUE); + + /* Specify data destination for compression */ + jpeg_stdio_dest(&cinfo, output_file); + + /* Start compressor */ + jpeg_start_compress(&cinfo, TRUE); + + /* Process data */ + while (cinfo.next_scanline < cinfo.image_height) { + num_scanlines = (*src_mgr->get_pixel_rows) (&cinfo, src_mgr); + (void) jpeg_write_scanlines(&cinfo, src_mgr->buffer, num_scanlines); + } + + /* Finish compression and release memory */ + (*src_mgr->finish_input) (&cinfo, src_mgr); + jpeg_finish_compress(&cinfo); + jpeg_destroy_compress(&cinfo); + + /* Close files, if we opened them */ + if (input_file != stdin) + fclose(input_file); + if (output_file != stdout) + fclose(output_file); + +#ifdef PROGRESS_REPORT + end_progress_monitor((j_common_ptr) &cinfo); +#endif + + /* All done. */ + exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS); + return 0; /* suppress no-return-value warnings */ +} diff --git a/jpeg-8c/ckconfig.c b/jpeg-8c/ckconfig.c new file mode 100644 index 00000000..e658623f --- /dev/null +++ b/jpeg-8c/ckconfig.c @@ -0,0 +1,402 @@ +/* + * ckconfig.c + * + * 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 program is intended to help you determine how to configure the JPEG + * software for installation on a particular system. The idea is to try to + * compile and execute this program. If your compiler fails to compile the + * program, make changes as indicated in the comments below. Once you can + * compile the program, run it, and it will produce a "jconfig.h" file for + * your system. + * + * As a general rule, each time you try to compile this program, + * pay attention only to the *first* error message you get from the compiler. + * Many C compilers will issue lots of spurious error messages once they + * have gotten confused. Go to the line indicated in the first error message, + * and read the comments preceding that line to see what to change. + * + * Almost all of the edits you may need to make to this program consist of + * changing a line that reads "#define SOME_SYMBOL" to "#undef SOME_SYMBOL", + * or vice versa. This is called defining or undefining that symbol. + */ + + +/* First we must see if your system has the include files we need. + * We start out with the assumption that your system has all the ANSI-standard + * include files. If you get any error trying to include one of these files, + * undefine the corresponding HAVE_xxx symbol. + */ + +#define HAVE_STDDEF_H /* replace 'define' by 'undef' if error here */ +#ifdef HAVE_STDDEF_H /* next line will be skipped if you undef... */ +#include +#endif + +#define HAVE_STDLIB_H /* same thing for stdlib.h */ +#ifdef HAVE_STDLIB_H +#include +#endif + +#include /* If you ain't got this, you ain't got C. */ + +/* We have to see if your string functions are defined by + * strings.h (old BSD convention) or string.h (everybody else). + * We try the non-BSD convention first; define NEED_BSD_STRINGS + * if the compiler says it can't find string.h. + */ + +#undef NEED_BSD_STRINGS + +#ifdef NEED_BSD_STRINGS +#include +#else +#include +#endif + +/* On some systems (especially older Unix machines), type size_t is + * defined only in the include file . If you get a failure + * on the size_t test below, try defining NEED_SYS_TYPES_H. + */ + +#undef NEED_SYS_TYPES_H /* start by assuming we don't need it */ +#ifdef NEED_SYS_TYPES_H +#include +#endif + + +/* Usually type size_t is defined in one of the include files we've included + * above. If not, you'll get an error on the "typedef size_t my_size_t;" line. + * In that case, first try defining NEED_SYS_TYPES_H just above. + * If that doesn't work, you'll have to search through your system library + * to figure out which include file defines "size_t". Look for a line that + * says "typedef something-or-other size_t;". Then, change the line below + * that says "#include " to instead include the file + * you found size_t in, and define NEED_SPECIAL_INCLUDE. If you can't find + * type size_t anywhere, try replacing "#include " with + * "typedef unsigned int size_t;". + */ + +#undef NEED_SPECIAL_INCLUDE /* assume we DON'T need it, for starters */ + +#ifdef NEED_SPECIAL_INCLUDE +#include +#endif + +typedef size_t my_size_t; /* The payoff: do we have size_t now? */ + + +/* The next question is whether your compiler supports ANSI-style function + * prototypes. You need to know this in order to choose between using + * makefile.ansi and using makefile.unix. + * The #define line below is set to assume you have ANSI function prototypes. + * If you get an error in this group of lines, undefine HAVE_PROTOTYPES. + */ + +#define HAVE_PROTOTYPES + +#ifdef HAVE_PROTOTYPES +int testfunction (int arg1, int * arg2); /* check prototypes */ + +struct methods_struct { /* check method-pointer declarations */ + int (*error_exit) (char *msgtext); + int (*trace_message) (char *msgtext); + int (*another_method) (void); +}; + +int testfunction (int arg1, int * arg2) /* check definitions */ +{ + return arg2[arg1]; +} + +int test2function (void) /* check void arg list */ +{ + return 0; +} +#endif + + +/* Now we want to find out if your compiler knows what "unsigned char" means. + * If you get an error on the "unsigned char un_char;" line, + * then undefine HAVE_UNSIGNED_CHAR. + */ + +#define HAVE_UNSIGNED_CHAR + +#ifdef HAVE_UNSIGNED_CHAR +unsigned char un_char; +#endif + + +/* Now we want to find out if your compiler knows what "unsigned short" means. + * If you get an error on the "unsigned short un_short;" line, + * then undefine HAVE_UNSIGNED_SHORT. + */ + +#define HAVE_UNSIGNED_SHORT + +#ifdef HAVE_UNSIGNED_SHORT +unsigned short un_short; +#endif + + +/* Now we want to find out if your compiler understands type "void". + * If you get an error anywhere in here, undefine HAVE_VOID. + */ + +#define HAVE_VOID + +#ifdef HAVE_VOID +/* Caution: a C++ compiler will insist on complete prototypes */ +typedef void * void_ptr; /* check void * */ +#ifdef HAVE_PROTOTYPES /* check ptr to function returning void */ +typedef void (*void_func) (int a, int b); +#else +typedef void (*void_func) (); +#endif + +#ifdef HAVE_PROTOTYPES /* check void function result */ +void test3function (void_ptr arg1, void_func arg2) +#else +void test3function (arg1, arg2) + void_ptr arg1; + void_func arg2; +#endif +{ + char * locptr = (char *) arg1; /* check casting to and from void * */ + arg1 = (void *) locptr; + (*arg2) (1, 2); /* check call of fcn returning void */ +} +#endif + + +/* Now we want to find out if your compiler knows what "const" means. + * If you get an error here, undefine HAVE_CONST. + */ + +#define HAVE_CONST + +#ifdef HAVE_CONST +static const int carray[3] = {1, 2, 3}; + +#ifdef HAVE_PROTOTYPES +int test4function (const int arg1) +#else +int test4function (arg1) + const int arg1; +#endif +{ + return carray[arg1]; +} +#endif + + +/* If you get an error or warning about this structure definition, + * define INCOMPLETE_TYPES_BROKEN. + */ + +#undef INCOMPLETE_TYPES_BROKEN + +#ifndef INCOMPLETE_TYPES_BROKEN +typedef struct undefined_structure * undef_struct_ptr; +#endif + + +/* If you get an error about duplicate names, + * define NEED_SHORT_EXTERNAL_NAMES. + */ + +#undef NEED_SHORT_EXTERNAL_NAMES + +#ifndef NEED_SHORT_EXTERNAL_NAMES + +int possibly_duplicate_function () +{ + return 0; +} + +int possibly_dupli_function () +{ + return 1; +} + +#endif + + + +/************************************************************************ + * OK, that's it. You should not have to change anything beyond this + * point in order to compile and execute this program. (You might get + * some warnings, but you can ignore them.) + * When you run the program, it will make a couple more tests that it + * can do automatically, and then it will create jconfig.h and print out + * any additional suggestions it has. + ************************************************************************ + */ + + +#ifdef HAVE_PROTOTYPES +int is_char_signed (int arg) +#else +int is_char_signed (arg) + int arg; +#endif +{ + if (arg == 189) { /* expected result for unsigned char */ + return 0; /* type char is unsigned */ + } + else if (arg != -67) { /* expected result for signed char */ + printf("Hmm, it seems 'char' is not eight bits wide on your machine.\n"); + printf("I fear the JPEG software will not work at all.\n\n"); + } + return 1; /* assume char is signed otherwise */ +} + + +#ifdef HAVE_PROTOTYPES +int is_shifting_signed (long arg) +#else +int is_shifting_signed (arg) + long arg; +#endif +/* See whether right-shift on a long is signed or not. */ +{ + long res = arg >> 4; + + if (res == -0x7F7E80CL) { /* expected result for signed shift */ + return 1; /* right shift is signed */ + } + /* see if unsigned-shift hack will fix it. */ + /* we can't just test exact value since it depends on width of long... */ + res |= (~0L) << (32-4); + if (res == -0x7F7E80CL) { /* expected result now? */ + return 0; /* right shift is unsigned */ + } + printf("Right shift isn't acting as I expect it to.\n"); + printf("I fear the JPEG software will not work at all.\n\n"); + return 0; /* try it with unsigned anyway */ +} + + +#ifdef HAVE_PROTOTYPES +int main (int argc, char ** argv) +#else +int main (argc, argv) + int argc; + char ** argv; +#endif +{ + char signed_char_check = (char) (-67); + FILE *outfile; + + /* Attempt to write jconfig.h */ + if ((outfile = fopen("jconfig.h", "w")) == NULL) { + printf("Failed to write jconfig.h\n"); + return 1; + } + + /* Write out all the info */ + fprintf(outfile, "/* jconfig.h --- generated by ckconfig.c */\n"); + fprintf(outfile, "/* see jconfig.txt for explanations */\n\n"); +#ifdef HAVE_PROTOTYPES + fprintf(outfile, "#define HAVE_PROTOTYPES\n"); +#else + fprintf(outfile, "#undef HAVE_PROTOTYPES\n"); +#endif +#ifdef HAVE_UNSIGNED_CHAR + fprintf(outfile, "#define HAVE_UNSIGNED_CHAR\n"); +#else + fprintf(outfile, "#undef HAVE_UNSIGNED_CHAR\n"); +#endif +#ifdef HAVE_UNSIGNED_SHORT + fprintf(outfile, "#define HAVE_UNSIGNED_SHORT\n"); +#else + fprintf(outfile, "#undef HAVE_UNSIGNED_SHORT\n"); +#endif +#ifdef HAVE_VOID + fprintf(outfile, "/* #define void char */\n"); +#else + fprintf(outfile, "#define void char\n"); +#endif +#ifdef HAVE_CONST + fprintf(outfile, "/* #define const */\n"); +#else + fprintf(outfile, "#define const\n"); +#endif + if (is_char_signed((int) signed_char_check)) + fprintf(outfile, "#undef CHAR_IS_UNSIGNED\n"); + else + fprintf(outfile, "#define CHAR_IS_UNSIGNED\n"); +#ifdef HAVE_STDDEF_H + fprintf(outfile, "#define HAVE_STDDEF_H\n"); +#else + fprintf(outfile, "#undef HAVE_STDDEF_H\n"); +#endif +#ifdef HAVE_STDLIB_H + fprintf(outfile, "#define HAVE_STDLIB_H\n"); +#else + fprintf(outfile, "#undef HAVE_STDLIB_H\n"); +#endif +#ifdef NEED_BSD_STRINGS + fprintf(outfile, "#define NEED_BSD_STRINGS\n"); +#else + fprintf(outfile, "#undef NEED_BSD_STRINGS\n"); +#endif +#ifdef NEED_SYS_TYPES_H + fprintf(outfile, "#define NEED_SYS_TYPES_H\n"); +#else + fprintf(outfile, "#undef NEED_SYS_TYPES_H\n"); +#endif + fprintf(outfile, "#undef NEED_FAR_POINTERS\n"); +#ifdef NEED_SHORT_EXTERNAL_NAMES + fprintf(outfile, "#define NEED_SHORT_EXTERNAL_NAMES\n"); +#else + fprintf(outfile, "#undef NEED_SHORT_EXTERNAL_NAMES\n"); +#endif +#ifdef INCOMPLETE_TYPES_BROKEN + fprintf(outfile, "#define INCOMPLETE_TYPES_BROKEN\n"); +#else + fprintf(outfile, "#undef INCOMPLETE_TYPES_BROKEN\n"); +#endif + fprintf(outfile, "\n#ifdef JPEG_INTERNALS\n\n"); + if (is_shifting_signed(-0x7F7E80B1L)) + fprintf(outfile, "#undef RIGHT_SHIFT_IS_UNSIGNED\n"); + else + fprintf(outfile, "#define RIGHT_SHIFT_IS_UNSIGNED\n"); + fprintf(outfile, "\n#endif /* JPEG_INTERNALS */\n"); + fprintf(outfile, "\n#ifdef JPEG_CJPEG_DJPEG\n\n"); + fprintf(outfile, "#define BMP_SUPPORTED /* BMP image file format */\n"); + fprintf(outfile, "#define GIF_SUPPORTED /* GIF image file format */\n"); + fprintf(outfile, "#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */\n"); + fprintf(outfile, "#undef RLE_SUPPORTED /* Utah RLE image file format */\n"); + fprintf(outfile, "#define TARGA_SUPPORTED /* Targa image file format */\n\n"); + fprintf(outfile, "#undef TWO_FILE_COMMANDLINE /* You may need this on non-Unix systems */\n"); + fprintf(outfile, "#undef NEED_SIGNAL_CATCHER /* Define this if you use jmemname.c */\n"); + fprintf(outfile, "#undef DONT_USE_B_MODE\n"); + fprintf(outfile, "/* #define PROGRESS_REPORT */ /* optional */\n"); + fprintf(outfile, "\n#endif /* JPEG_CJPEG_DJPEG */\n"); + + /* Close the jconfig.h file */ + fclose(outfile); + + /* User report */ + printf("Configuration check for Independent JPEG Group's software done.\n"); + printf("\nI have written the jconfig.h file for you.\n\n"); +#ifdef HAVE_PROTOTYPES + printf("You should use makefile.ansi as the starting point for your Makefile.\n"); +#else + printf("You should use makefile.unix as the starting point for your Makefile.\n"); +#endif + +#ifdef NEED_SPECIAL_INCLUDE + printf("\nYou'll need to change jconfig.h to include the system include file\n"); + printf("that you found type size_t in, or add a direct definition of type\n"); + printf("size_t if that's what you used. Just add it to the end.\n"); +#endif + + return 0; +} diff --git a/jpeg-8c/coderules.txt b/jpeg-8c/coderules.txt new file mode 100644 index 00000000..357929fb --- /dev/null +++ b/jpeg-8c/coderules.txt @@ -0,0 +1,118 @@ +IJG JPEG LIBRARY: CODING RULES + +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. + + +Since numerous people will be contributing code and bug fixes, it's important +to establish a common coding style. The goal of using similar coding styles +is much more important than the details of just what that style is. + +In general we follow the recommendations of "Recommended C Style and Coding +Standards" revision 6.1 (Cannon et al. as modified by Spencer, Keppel and +Brader). This document is available in the IJG FTP archive (see +jpeg/doc/cstyle.ms.tbl.Z, or cstyle.txt.Z for those without nroff/tbl). + +Block comments should be laid out thusly: + +/* + * Block comments in this style. + */ + +We indent statements in K&R style, e.g., + if (test) { + then-part; + } else { + else-part; + } +with two spaces per indentation level. (This indentation convention is +handled automatically by GNU Emacs and many other text editors.) + +Multi-word names should be written in lower case with underscores, e.g., +multi_word_name (not multiWordName). Preprocessor symbols and enum constants +are similar but upper case (MULTI_WORD_NAME). Names should be unique within +the first fifteen characters. (On some older systems, global names must be +unique within six characters. We accommodate this without cluttering the +source code by using macros to substitute shorter names.) + +We use function prototypes everywhere; we rely on automatic source code +transformation to feed prototype-less C compilers. Transformation is done +by the simple and portable tool 'ansi2knr.c' (courtesy of Ghostscript). +ansi2knr is not very bright, so it imposes a format requirement on function +declarations: the function name MUST BEGIN IN COLUMN 1. Thus all functions +should be written in the following style: + +LOCAL(int *) +function_name (int a, char *b) +{ + code... +} + +Note that each function definition must begin with GLOBAL(type), LOCAL(type), +or METHODDEF(type). These macros expand to "static type" or just "type" as +appropriate. They provide a readable indication of the routine's usage and +can readily be changed for special needs. (For instance, special linkage +keywords can be inserted for use in Windows DLLs.) + +ansi2knr does not transform method declarations (function pointers in +structs). We handle these with a macro JMETHOD, defined as + #ifdef HAVE_PROTOTYPES + #define JMETHOD(type,methodname,arglist) type (*methodname) arglist + #else + #define JMETHOD(type,methodname,arglist) type (*methodname) () + #endif +which is used like this: + struct function_pointers { + JMETHOD(void, init_entropy_encoder, (int somearg, jparms *jp)); + JMETHOD(void, term_entropy_encoder, (void)); + }; +Note the set of parentheses surrounding the parameter list. + +A similar solution is used for forward and external function declarations +(see the EXTERN and JPP macros). + +If the code is to work on non-ANSI compilers, we cannot rely on a prototype +declaration to coerce actual parameters into the right types. Therefore, use +explicit casts on actual parameters whenever the actual parameter type is not +identical to the formal parameter. Beware of implicit conversions to "int". + +It seems there are some non-ANSI compilers in which the sizeof() operator +is defined to return int, yet size_t is defined as long. Needless to say, +this is brain-damaged. Always use the SIZEOF() macro in place of sizeof(), +so that the result is guaranteed to be of type size_t. + + +The JPEG library is intended to be used within larger programs. Furthermore, +we want it to be reentrant so that it can be used by applications that process +multiple images concurrently. The following rules support these requirements: + +1. Avoid direct use of file I/O, "malloc", error report printouts, etc; +pass these through the common routines provided. + +2. Minimize global namespace pollution. Functions should be declared static +wherever possible. (Note that our method-based calling conventions help this +a lot: in many modules only the initialization function will ever need to be +called directly, so only that function need be externally visible.) All +global function names should begin with "jpeg_", and should have an +abbreviated name (unique in the first six characters) substituted by macro +when NEED_SHORT_EXTERNAL_NAMES is set. + +3. Don't use global variables; anything that must be used in another module +should be in the common data structures. + +4. Don't use static variables except for read-only constant tables. Variables +that should be private to a module can be placed into private structures (see +the system architecture document, structure.txt). + +5. Source file names should begin with "j" for files that are part of the +library proper; source files that are not part of the library, such as cjpeg.c +and djpeg.c, do not begin with "j". Keep source file names to eight +characters (plus ".c" or ".h", etc) to make life easy for MS-DOSers. Keep +compression and decompression code in separate source files --- some +applications may want only one half of the library. + +Note: these rules (particularly #4) are not followed religiously in the +modules that are used in cjpeg/djpeg but are not part of the JPEG library +proper. Those modules are not really intended to be used in other +applications. diff --git a/jpeg-8c/config.guess b/jpeg-8c/config.guess new file mode 100755 index 00000000..dc84c68e --- /dev/null +++ b/jpeg-8c/config.guess @@ -0,0 +1,1501 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +# Free Software Foundation, Inc. + +timestamp='2009-11-20' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/jpeg-8c/config.log b/jpeg-8c/config.log new file mode 100644 index 00000000..f3480281 --- /dev/null +++ b/jpeg-8c/config.log @@ -0,0 +1,1086 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by libjpeg configure 8.3.0, which was +generated by GNU Autoconf 2.68. Invocation command line was + + $ ./configure + +## --------- ## +## Platform. ## +## --------- ## + +hostname = hit +uname -m = x86_64 +uname -r = 2.6.32-22-pve +uname -s = Linux +uname -v = #1 SMP Mon Jul 15 08:36:46 CEST 2013 + +/usr/bin/uname -p = unknown +/bin/uname -X = unknown + +/bin/arch = unknown +/usr/bin/arch -k = unknown +/usr/convex/getsysinfo = unknown +/usr/bin/hostinfo = unknown +/bin/machine = unknown +/usr/bin/oslevel = unknown +/bin/universe = unknown + +PATH: /usr/local/sbin +PATH: /usr/local/bin +PATH: /usr/sbin +PATH: /usr/bin +PATH: /sbin +PATH: /bin + + +## ----------- ## +## Core tests. ## +## ----------- ## + +configure:2249: checking build system type +configure:2263: result: x86_64-unknown-linux-gnu +configure:2283: checking host system type +configure:2296: result: x86_64-unknown-linux-gnu +configure:2316: checking target system type +configure:2329: result: x86_64-unknown-linux-gnu +configure:2374: checking for a BSD-compatible install +configure:2442: result: /usr/bin/install -c +configure:2453: checking whether build environment is sane +configure:2503: result: yes +configure:2644: checking for a thread-safe mkdir -p +configure:2683: result: /bin/mkdir -p +configure:2696: checking for gawk +configure:2726: result: no +configure:2696: checking for mawk +configure:2712: found /usr/bin/mawk +configure:2723: result: mawk +configure:2734: checking whether make sets $(MAKE) +configure:2756: result: yes +configure:2866: checking for style of include used by make +configure:2894: result: GNU +configure:2964: checking for gcc +configure:2980: found /usr/bin/gcc +configure:2991: result: gcc +configure:3220: checking for C compiler version +configure:3229: gcc --version >&5 +gcc (Debian 4.7.2-5) 4.7.2 +Copyright (C) 2012 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +configure:3240: $? = 0 +configure:3229: gcc -v >&5 +Using built-in specs. +COLLECT_GCC=gcc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Debian 4.7.2-5' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 4.7.2 (Debian 4.7.2-5) +configure:3240: $? = 0 +configure:3229: gcc -V >&5 +gcc: error: unrecognized command line option '-V' +gcc: fatal error: no input files +compilation terminated. +configure:3240: $? = 4 +configure:3229: gcc -qversion >&5 +gcc: error: unrecognized command line option '-qversion' +gcc: fatal error: no input files +compilation terminated. +configure:3240: $? = 4 +configure:3260: checking whether the C compiler works +configure:3282: gcc conftest.c >&5 +configure:3286: $? = 0 +configure:3334: result: yes +configure:3337: checking for C compiler default output file name +configure:3339: result: a.out +configure:3345: checking for suffix of executables +configure:3352: gcc -o conftest conftest.c >&5 +configure:3356: $? = 0 +configure:3378: result: +configure:3400: checking whether we are cross compiling +configure:3408: gcc -o conftest conftest.c >&5 +configure:3412: $? = 0 +configure:3419: ./conftest +configure:3423: $? = 0 +configure:3438: result: no +configure:3443: checking for suffix of object files +configure:3465: gcc -c conftest.c >&5 +configure:3469: $? = 0 +configure:3490: result: o +configure:3494: checking whether we are using the GNU C compiler +configure:3513: gcc -c conftest.c >&5 +configure:3513: $? = 0 +configure:3522: result: yes +configure:3531: checking whether gcc accepts -g +configure:3551: gcc -c -g conftest.c >&5 +configure:3551: $? = 0 +configure:3592: result: yes +configure:3609: checking for gcc option to accept ISO C89 +configure:3673: gcc -c -g -O2 conftest.c >&5 +configure:3673: $? = 0 +configure:3686: result: none needed +configure:3708: checking dependency style of gcc +configure:3818: result: gcc3 +configure:3833: checking for function prototypes +configure:3836: result: yes +configure:3855: checking how to run the C preprocessor +configure:3886: gcc -E conftest.c +configure:3886: $? = 0 +configure:3900: gcc -E conftest.c +conftest.c:13:28: fatal error: ac_nonexistent.h: No such file or directory +compilation terminated. +configure:3900: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libjpeg" +| #define PACKAGE_TARNAME "libjpeg" +| #define PACKAGE_VERSION "8.3.0" +| #define PACKAGE_STRING "libjpeg 8.3.0" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define PACKAGE "libjpeg" +| #define VERSION "8.3.0" +| #define PROTOTYPES 1 +| #define __PROTOTYPES 1 +| /* end confdefs.h. */ +| #include +configure:3925: result: gcc -E +configure:3945: gcc -E conftest.c +configure:3945: $? = 0 +configure:3959: gcc -E conftest.c +conftest.c:13:28: fatal error: ac_nonexistent.h: No such file or directory +compilation terminated. +configure:3959: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libjpeg" +| #define PACKAGE_TARNAME "libjpeg" +| #define PACKAGE_VERSION "8.3.0" +| #define PACKAGE_STRING "libjpeg 8.3.0" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define PACKAGE "libjpeg" +| #define VERSION "8.3.0" +| #define PROTOTYPES 1 +| #define __PROTOTYPES 1 +| /* end confdefs.h. */ +| #include +configure:3988: checking for grep that handles long lines and -e +configure:4046: result: /bin/grep +configure:4051: checking for egrep +configure:4113: result: /bin/grep -E +configure:4118: checking for ANSI C header files +configure:4138: gcc -c -g -O2 conftest.c >&5 +configure:4138: $? = 0 +configure:4211: gcc -o conftest -g -O2 conftest.c >&5 +configure:4211: $? = 0 +configure:4211: ./conftest +configure:4211: $? = 0 +configure:4222: result: yes +configure:4235: checking for sys/types.h +configure:4235: gcc -c -g -O2 conftest.c >&5 +configure:4235: $? = 0 +configure:4235: result: yes +configure:4235: checking for sys/stat.h +configure:4235: gcc -c -g -O2 conftest.c >&5 +configure:4235: $? = 0 +configure:4235: result: yes +configure:4235: checking for stdlib.h +configure:4235: gcc -c -g -O2 conftest.c >&5 +configure:4235: $? = 0 +configure:4235: result: yes +configure:4235: checking for string.h +configure:4235: gcc -c -g -O2 conftest.c >&5 +configure:4235: $? = 0 +configure:4235: result: yes +configure:4235: checking for memory.h +configure:4235: gcc -c -g -O2 conftest.c >&5 +configure:4235: $? = 0 +configure:4235: result: yes +configure:4235: checking for strings.h +configure:4235: gcc -c -g -O2 conftest.c >&5 +configure:4235: $? = 0 +configure:4235: result: yes +configure:4235: checking for inttypes.h +configure:4235: gcc -c -g -O2 conftest.c >&5 +configure:4235: $? = 0 +configure:4235: result: yes +configure:4235: checking for stdint.h +configure:4235: gcc -c -g -O2 conftest.c >&5 +configure:4235: $? = 0 +configure:4235: result: yes +configure:4235: checking for unistd.h +configure:4235: gcc -c -g -O2 conftest.c >&5 +configure:4235: $? = 0 +configure:4235: result: yes +configure:4257: checking for string.h +configure:4257: result: yes +configure:4273: checking whether to enable maintainer-specific portions of Makefiles +configure:4282: result: no +configure:4345: checking for gcc +configure:4372: result: gcc +configure:4601: checking for C compiler version +configure:4610: gcc --version >&5 +gcc (Debian 4.7.2-5) 4.7.2 +Copyright (C) 2012 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +configure:4621: $? = 0 +configure:4610: gcc -v >&5 +Using built-in specs. +COLLECT_GCC=gcc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Debian 4.7.2-5' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 4.7.2 (Debian 4.7.2-5) +configure:4621: $? = 0 +configure:4610: gcc -V >&5 +gcc: error: unrecognized command line option '-V' +gcc: fatal error: no input files +compilation terminated. +configure:4621: $? = 4 +configure:4610: gcc -qversion >&5 +gcc: error: unrecognized command line option '-qversion' +gcc: fatal error: no input files +compilation terminated. +configure:4621: $? = 4 +configure:4625: checking whether we are using the GNU C compiler +configure:4653: result: yes +configure:4662: checking whether gcc accepts -g +configure:4723: result: yes +configure:4740: checking for gcc option to accept ISO C89 +configure:4817: result: none needed +configure:4839: checking dependency style of gcc +configure:4949: result: gcc3 +configure:4968: checking for gcc option to accept ISO C99 +configure:5117: gcc -c -g -O2 conftest.c >&5 +conftest.c:74:29: error: expected ';', ',' or ')' before 'text' +conftest.c: In function 'main': +conftest.c:128:18: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'newvar' +conftest.c:128:18: error: 'newvar' undeclared (first use in this function) +conftest.c:128:18: note: each undeclared identifier is reported only once for each function it appears in +conftest.c:138:3: error: 'for' loop initial declarations are only allowed in C99 mode +conftest.c:138:3: note: use option -std=c99 or -std=gnu99 to compile your code +configure:5117: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libjpeg" +| #define PACKAGE_TARNAME "libjpeg" +| #define PACKAGE_VERSION "8.3.0" +| #define PACKAGE_STRING "libjpeg 8.3.0" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define PACKAGE "libjpeg" +| #define VERSION "8.3.0" +| #define PROTOTYPES 1 +| #define __PROTOTYPES 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_STRING_H 1 +| /* end confdefs.h. */ +| #include +| #include +| #include +| #include +| #include +| +| // Check varargs macros. These examples are taken from C99 6.10.3.5. +| #define debug(...) fprintf (stderr, __VA_ARGS__) +| #define showlist(...) puts (#__VA_ARGS__) +| #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +| static void +| test_varargs_macros (void) +| { +| int x = 1234; +| int y = 5678; +| debug ("Flag"); +| debug ("X = %d\n", x); +| showlist (The first, second, and third items.); +| report (x>y, "x is %d but y is %d", x, y); +| } +| +| // Check long long types. +| #define BIG64 18446744073709551615ull +| #define BIG32 4294967295ul +| #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +| #if !BIG_OK +| your preprocessor is broken; +| #endif +| #if BIG_OK +| #else +| your preprocessor is broken; +| #endif +| static long long int bignum = -9223372036854775807LL; +| static unsigned long long int ubignum = BIG64; +| +| struct incomplete_array +| { +| int datasize; +| double data[]; +| }; +| +| struct named_init { +| int number; +| const wchar_t *name; +| double average; +| }; +| +| typedef const char *ccp; +| +| static inline int +| test_restrict (ccp restrict text) +| { +| // See if C++-style comments work. +| // Iterate through items via the restricted pointer. +| // Also check for declarations in for loops. +| for (unsigned int i = 0; *(text+i) != '\0'; ++i) +| continue; +| return 0; +| } +| +| // Check varargs and va_copy. +| static void +| test_varargs (const char *format, ...) +| { +| va_list args; +| va_start (args, format); +| va_list args_copy; +| va_copy (args_copy, args); +| +| const char *str; +| int number; +| float fnumber; +| +| while (*format) +| { +| switch (*format++) +| { +| case 's': // string +| str = va_arg (args_copy, const char *); +| break; +| case 'd': // int +| number = va_arg (args_copy, int); +| break; +| case 'f': // float +| fnumber = va_arg (args_copy, double); +| break; +| default: +| break; +| } +| } +| va_end (args_copy); +| va_end (args); +| } +| +| int +| main () +| { +| +| // Check bool. +| _Bool success = false; +| +| // Check restrict. +| if (test_restrict ("String literal") == 0) +| success = true; +| char *restrict newvar = "Another string"; +| +| // Check varargs. +| test_varargs ("s, d' f .", "string", 65, 34.234); +| test_varargs_macros (); +| +| // Check flexible array members. +| struct incomplete_array *ia = +| malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); +| ia->datasize = 10; +| for (int i = 0; i < ia->datasize; ++i) +| ia->data[i] = i * 1.234; +| +| // Check named initializers. +| struct named_init ni = { +| .number = 34, +| .name = L"Test wide string", +| .average = 543.34343, +| }; +| +| ni.number = 58; +| +| int dynamic_array[ni.number]; +| dynamic_array[ni.number - 1] = 543; +| +| // work around unused variable warnings +| return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' +| || dynamic_array[ni.number - 1] != 543); +| +| ; +| return 0; +| } +configure:5117: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:5117: $? = 0 +configure:5137: result: -std=gnu99 +configure:5239: checking for gcc -std=gnu99 option to accept ISO Standard C +configure:5253: result: -std=gnu99 +configure:5262: checking how to run the C preprocessor +configure:5332: result: gcc -E +configure:5352: gcc -E conftest.c +configure:5352: $? = 0 +configure:5366: gcc -E conftest.c +conftest.c:24:28: fatal error: ac_nonexistent.h: No such file or directory +compilation terminated. +configure:5366: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libjpeg" +| #define PACKAGE_TARNAME "libjpeg" +| #define PACKAGE_VERSION "8.3.0" +| #define PACKAGE_STRING "libjpeg 8.3.0" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define PACKAGE "libjpeg" +| #define VERSION "8.3.0" +| #define PROTOTYPES 1 +| #define __PROTOTYPES 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_STRING_H 1 +| /* end confdefs.h. */ +| #include +configure:5395: checking whether make sets $(MAKE) +configure:5417: result: yes +configure:5426: checking whether ln -s works +configure:5430: result: yes +configure:5446: checking if LD -Wl,--version-script works +configure:5470: gcc -std=gnu99 -o conftest -g -O2 -Wl,--version-script=conftest.map conftest.c >&5 +configure:5470: $? = 0 +configure:5479: result: yes +configure:5492: checking for function prototypes +configure:5519: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:5519: $? = 0 +configure:5527: result: yes +configure:5545: checking stddef.h usability +configure:5545: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:5545: $? = 0 +configure:5545: result: yes +configure:5545: checking stddef.h presence +configure:5545: gcc -E conftest.c +configure:5545: $? = 0 +configure:5545: result: yes +configure:5545: checking for stddef.h +configure:5545: result: yes +configure:5545: checking for stdlib.h +configure:5545: result: yes +configure:5545: checking locale.h usability +configure:5545: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:5545: $? = 0 +configure:5545: result: yes +configure:5545: checking locale.h presence +configure:5545: gcc -E conftest.c +configure:5545: $? = 0 +configure:5545: result: yes +configure:5545: checking for locale.h +configure:5545: result: yes +configure:5555: checking for string.h +configure:5555: result: yes +configure:5568: checking for size_t +configure:5595: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:5595: $? = 0 +configure:5601: result: yes +configure:5635: checking for type unsigned char +configure:5648: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:5648: $? = 0 +configure:5649: result: yes +configure:5659: checking for type unsigned short +configure:5672: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:5672: $? = 0 +configure:5673: result: yes +configure:5683: checking for type void +configure:5717: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:5717: $? = 0 +configure:5718: result: yes +configure:5728: checking for an ANSI C-conforming const +configure:5793: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:5793: $? = 0 +configure:5800: result: yes +configure:5810: checking for inline +configure:5825: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:5825: $? = 0 +configure:5863: result: __inline__ +configure:5872: checking for broken incomplete types +configure:5885: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:5885: $? = 0 +configure:5886: result: ok +configure:5898: checking for short external names +configure:5914: gcc -std=gnu99 -o conftest -g -O2 conftest.c >&5 +configure:5914: $? = 0 +configure:5915: result: ok +configure:5928: checking to see if char is signed +configure:5959: gcc -std=gnu99 -o conftest -g -O2 conftest.c >&5 +conftest.c: In function 'is_char_signed': +conftest.c:43:5: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration] +conftest.c:43:5: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default] +conftest.c: In function 'main': +conftest.c:50:3: warning: implicit declaration of function 'exit' [-Wimplicit-function-declaration] +conftest.c:50:3: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] +configure:5959: $? = 0 +configure:5959: ./conftest +configure:5959: $? = 1 +configure: program exited with status 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libjpeg" +| #define PACKAGE_TARNAME "libjpeg" +| #define PACKAGE_VERSION "8.3.0" +| #define PACKAGE_STRING "libjpeg 8.3.0" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define PACKAGE "libjpeg" +| #define VERSION "8.3.0" +| #define PROTOTYPES 1 +| #define __PROTOTYPES 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_PROTOTYPES 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_LOCALE_H 1 +| #define HAVE_UNSIGNED_CHAR 1 +| #define HAVE_UNSIGNED_SHORT 1 +| #define INLINE __inline__ +| /* end confdefs.h. */ +| +| #ifdef HAVE_PROTOTYPES +| int is_char_signed (int arg) +| #else +| int is_char_signed (arg) +| int arg; +| #endif +| { +| if (arg == 189) { /* expected result for unsigned char */ +| return 0; /* type char is unsigned */ +| } +| else if (arg != -67) { /* expected result for signed char */ +| printf("Hmm, it seems 'char' is not eight bits wide on your machine.\n"); +| printf("I fear the JPEG software will not work at all.\n\n"); +| } +| return 1; /* assume char is signed otherwise */ +| } +| char signed_char_check = (char) (-67); +| int main() { +| exit(is_char_signed((int) signed_char_check)); +| } +configure:5966: result: yes +configure:5973: checking to see if right shift is signed +configure:6009: gcc -std=gnu99 -o conftest -g -O2 conftest.c >&5 +conftest.c: In function 'is_shifting_signed': +conftest.c:51:3: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration] +conftest.c:51:3: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default] +conftest.c: In function 'main': +conftest.c:56:3: warning: implicit declaration of function 'exit' [-Wimplicit-function-declaration] +conftest.c:56:3: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] +configure:6009: $? = 0 +configure:6009: ./conftest +configure:6009: $? = 1 +configure: program exited with status 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libjpeg" +| #define PACKAGE_TARNAME "libjpeg" +| #define PACKAGE_VERSION "8.3.0" +| #define PACKAGE_STRING "libjpeg 8.3.0" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define PACKAGE "libjpeg" +| #define VERSION "8.3.0" +| #define PROTOTYPES 1 +| #define __PROTOTYPES 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_PROTOTYPES 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_LOCALE_H 1 +| #define HAVE_UNSIGNED_CHAR 1 +| #define HAVE_UNSIGNED_SHORT 1 +| #define INLINE __inline__ +| /* end confdefs.h. */ +| +| #ifdef HAVE_PROTOTYPES +| int is_shifting_signed (long arg) +| #else +| int is_shifting_signed (arg) +| long arg; +| #endif +| /* See whether right-shift on a long is signed or not. */ +| { +| long res = arg >> 4; +| +| if (res == -0x7F7E80CL) { /* expected result for signed shift */ +| return 1; /* right shift is signed */ +| } +| /* see if unsigned-shift hack will fix it. */ +| /* we can't just test exact value since it depends on width of long... */ +| res |= (~0L) << (32-4); +| if (res == -0x7F7E80CL) { /* expected result now? */ +| return 0; /* right shift is unsigned */ +| } +| printf("Right shift isn't acting as I expect it to.\n"); +| printf("I fear the JPEG software will not work at all.\n\n"); +| return 0; /* try it with unsigned anyway */ +| } +| int main() { +| exit(is_shifting_signed(-0x7F7E80B1L)); +| } +configure:6016: result: yes +configure:6023: checking to see if fopen accepts b spec +configure:6039: gcc -std=gnu99 -o conftest -g -O2 conftest.c >&5 +conftest.c: In function 'main': +conftest.c:35:5: warning: implicit declaration of function 'exit' [-Wimplicit-function-declaration] +conftest.c:35:5: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] +conftest.c:36:3: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] +configure:6039: $? = 0 +configure:6039: ./conftest +configure:6039: $? = 0 +configure:6040: result: yes +configure:6404: checking how to print strings +configure:6431: result: printf +configure:6452: checking for a sed that does not truncate output +configure:6516: result: /bin/sed +configure:6534: checking for fgrep +configure:6596: result: /bin/grep -F +configure:6631: checking for ld used by gcc -std=gnu99 +configure:6698: result: /usr/bin/ld +configure:6705: checking if the linker (/usr/bin/ld) is GNU ld +configure:6720: result: yes +configure:6732: checking for BSD- or MS-compatible name lister (nm) +configure:6781: result: /usr/bin/nm -B +configure:6911: checking the name lister (/usr/bin/nm -B) interface +configure:6918: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:6921: /usr/bin/nm -B "conftest.o" +configure:6924: output +0000000000000000 B some_variable +configure:6931: result: BSD nm +configure:6935: checking the maximum length of command line arguments +configure:7060: result: 1966080 +configure:7077: checking whether the shell understands some XSI constructs +configure:7087: result: yes +configure:7091: checking whether the shell understands "+=" +configure:7097: result: yes +configure:7132: checking how to convert x86_64-unknown-linux-gnu file names to x86_64-unknown-linux-gnu format +configure:7172: result: func_convert_file_noop +configure:7179: checking how to convert x86_64-unknown-linux-gnu file names to toolchain format +configure:7199: result: func_convert_file_noop +configure:7206: checking for /usr/bin/ld option to reload object files +configure:7213: result: -r +configure:7287: checking for objdump +configure:7314: result: objdump +configure:7343: checking how to recognize dependent libraries +configure:7545: result: pass_all +configure:7630: checking for dlltool +configure:7657: result: dlltool +configure:7687: checking how to associate runtime and link libraries +configure:7714: result: printf %s\n +configure:7774: checking for ar +configure:7790: found /usr/bin/ar +configure:7801: result: ar +configure:7838: checking for archiver @FILE support +configure:7855: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:7855: $? = 0 +configure:7858: ar cru libconftest.a @conftest.lst >&5 +configure:7861: $? = 0 +configure:7866: ar cru libconftest.a @conftest.lst >&5 +ar: conftest.o: No such file or directory +configure:7869: $? = 1 +configure:7881: result: @ +configure:7939: checking for strip +configure:7955: found /usr/bin/strip +configure:7966: result: strip +configure:8038: checking for ranlib +configure:8054: found /usr/bin/ranlib +configure:8065: result: ranlib +configure:8167: checking command to parse /usr/bin/nm -B output from gcc -std=gnu99 object +configure:8286: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:8289: $? = 0 +configure:8293: /usr/bin/nm -B conftest.o \| sed -n -e 's/^.*[ ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p' | sed '/ __gnu_lto/d' \> conftest.nm +configure:8296: $? = 0 +configure:8362: gcc -std=gnu99 -o conftest -g -O2 conftest.c conftstm.o >&5 +configure:8365: $? = 0 +configure:8403: result: ok +configure:8440: checking for sysroot +configure:8470: result: no +configure:8547: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:8550: $? = 0 +configure:8713: checking for mt +configure:8729: found /bin/mt +configure:8740: result: mt +configure:8763: checking if mt is a manifest tool +configure:8769: mt '-?' +configure:8777: result: no +configure:9406: checking for dlfcn.h +configure:9406: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:9406: $? = 0 +configure:9406: result: yes +configure:9591: checking for objdir +configure:9606: result: .libs +configure:9873: checking if gcc -std=gnu99 supports -fno-rtti -fno-exceptions +configure:9891: gcc -std=gnu99 -c -g -O2 -fno-rtti -fno-exceptions conftest.c >&5 +cc1: warning: command line option '-fno-rtti' is valid for C++/ObjC++ but not for C [enabled by default] +configure:9895: $? = 0 +configure:9908: result: no +configure:10218: checking for gcc -std=gnu99 option to produce PIC +configure:10225: result: -fPIC -DPIC +configure:10233: checking if gcc -std=gnu99 PIC flag -fPIC -DPIC works +configure:10251: gcc -std=gnu99 -c -g -O2 -fPIC -DPIC -DPIC conftest.c >&5 +configure:10255: $? = 0 +configure:10268: result: yes +configure:10297: checking if gcc -std=gnu99 static flag -static works +configure:10325: result: yes +configure:10340: checking if gcc -std=gnu99 supports -c -o file.o +configure:10361: gcc -std=gnu99 -c -g -O2 -o out/conftest2.o conftest.c >&5 +configure:10365: $? = 0 +configure:10387: result: yes +configure:10395: checking if gcc -std=gnu99 supports -c -o file.o +configure:10442: result: yes +configure:10475: checking whether the gcc -std=gnu99 linker (/usr/bin/ld -m elf_x86_64) supports shared libraries +configure:11633: result: yes +configure:11670: checking whether -lc should be explicitly linked in +configure:11678: gcc -std=gnu99 -c -g -O2 conftest.c >&5 +configure:11681: $? = 0 +configure:11696: gcc -std=gnu99 -shared -fPIC -DPIC conftest.o -v -Wl,-soname -Wl,conftest -o conftest 2\>\&1 \| /bin/grep -lc \>/dev/null 2\>\&1 +configure:11699: $? = 0 +configure:11713: result: no +configure:11878: checking dynamic linker characteristics +configure:12392: gcc -std=gnu99 -o conftest -g -O2 -Wl,-rpath -Wl,/foo conftest.c >&5 +configure:12392: $? = 0 +configure:12614: result: GNU/Linux ld.so +configure:12721: checking how to hardcode library paths into programs +configure:12746: result: immediate +configure:13286: checking whether stripping libraries is possible +configure:13291: result: yes +configure:13326: checking if libtool supports shared libraries +configure:13328: result: yes +configure:13331: checking whether to build shared libraries +configure:13352: result: yes +configure:13355: checking whether to build static libraries +configure:13359: result: yes +configure:13475: checking libjpeg version number +configure:13480: result: 11:0:3 +configure:13627: creating ./config.status + +## ---------------------- ## +## Running config.status. ## +## ---------------------- ## + +This file was extended by libjpeg config.status 8.3.0, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = + CONFIG_HEADERS = + CONFIG_LINKS = + CONFIG_COMMANDS = + $ ./config.status + +on hit + +config.status:1114: creating Makefile +config.status:1114: creating jconfig.h +config.status:1343: executing depfiles commands +config.status:1343: executing libtool commands + +## ---------------- ## +## Cache variables. ## +## ---------------- ## + +ac_cv_build=x86_64-unknown-linux-gnu +ac_cv_c_compiler_gnu=yes +ac_cv_c_const=yes +ac_cv_env_CC_set= +ac_cv_env_CC_value= +ac_cv_env_CFLAGS_set= +ac_cv_env_CFLAGS_value= +ac_cv_env_CPPFLAGS_set= +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_LDFLAGS_set= +ac_cv_env_LDFLAGS_value= +ac_cv_env_LIBS_set= +ac_cv_env_LIBS_value= +ac_cv_env_build_alias_set= +ac_cv_env_build_alias_value= +ac_cv_env_host_alias_set= +ac_cv_env_host_alias_value= +ac_cv_env_target_alias_set= +ac_cv_env_target_alias_value= +ac_cv_header_dlfcn_h=yes +ac_cv_header_inttypes_h=yes +ac_cv_header_locale_h=yes +ac_cv_header_memory_h=yes +ac_cv_header_stdc=yes +ac_cv_header_stddef_h=yes +ac_cv_header_stdint_h=yes +ac_cv_header_stdlib_h=yes +ac_cv_header_string_h=yes +ac_cv_header_strings_h=yes +ac_cv_header_sys_stat_h=yes +ac_cv_header_sys_types_h=yes +ac_cv_header_unistd_h=yes +ac_cv_host=x86_64-unknown-linux-gnu +ac_cv_objext=o +ac_cv_path_EGREP='/bin/grep -E' +ac_cv_path_FGREP='/bin/grep -F' +ac_cv_path_GREP=/bin/grep +ac_cv_path_SED=/bin/sed +ac_cv_path_install='/usr/bin/install -c' +ac_cv_path_mkdir=/bin/mkdir +ac_cv_prog_AWK=mawk +ac_cv_prog_CPP='gcc -E' +ac_cv_prog_ac_ct_AR=ar +ac_cv_prog_ac_ct_CC=gcc +ac_cv_prog_ac_ct_DLLTOOL=dlltool +ac_cv_prog_ac_ct_MANIFEST_TOOL=mt +ac_cv_prog_ac_ct_OBJDUMP=objdump +ac_cv_prog_ac_ct_RANLIB=ranlib +ac_cv_prog_ac_ct_STRIP=strip +ac_cv_prog_cc_c89= +ac_cv_prog_cc_c99=-std=gnu99 +ac_cv_prog_cc_g=yes +ac_cv_prog_cc_stdc=-std=gnu99 +ac_cv_prog_make_make_set=yes +ac_cv_target=x86_64-unknown-linux-gnu +am_cv_CC_dependencies_compiler_type=gcc3 +ijg_cv_have_prototypes=yes +ijg_cv_inline=__inline__ +lt_cv_ar_at_file=@ +lt_cv_archive_cmds_need_lc=no +lt_cv_deplibs_check_method=pass_all +lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_ld_reload_flag=-r +lt_cv_nm_interface='BSD nm' +lt_cv_objdir=.libs +lt_cv_path_LD=/usr/bin/ld +lt_cv_path_NM='/usr/bin/nm -B' +lt_cv_path_mainfest_tool=no +lt_cv_prog_compiler_c_o=yes +lt_cv_prog_compiler_pic='-fPIC -DPIC' +lt_cv_prog_compiler_pic_works=yes +lt_cv_prog_compiler_rtti_exceptions=no +lt_cv_prog_compiler_static_works=yes +lt_cv_prog_gnu_ld=yes +lt_cv_sharedlib_from_linklib_cmd='printf %s\n' +lt_cv_shlibpath_overrides_runpath=no +lt_cv_sys_global_symbol_pipe='sed -n -e '\''s/^.*[ ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p'\'' | sed '\''/ __gnu_lto/d'\''' +lt_cv_sys_global_symbol_to_c_name_address='sed -n -e '\''s/^: \([^ ]*\)[ ]*$/ {\"\1\", (void *) 0},/p'\'' -e '\''s/^[ABCDGIRSTW]* \([^ ]*\) \([^ ]*\)$/ {"\2", (void *) \&\2},/p'\''' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='sed -n -e '\''s/^: \([^ ]*\)[ ]*$/ {\"\1\", (void *) 0},/p'\'' -e '\''s/^[ABCDGIRSTW]* \([^ ]*\) \(lib[^ ]*\)$/ {"\2", (void *) \&\2},/p'\'' -e '\''s/^[ABCDGIRSTW]* \([^ ]*\) \([^ ]*\)$/ {"lib\2", (void *) \&\2},/p'\''' +lt_cv_sys_global_symbol_to_cdecl='sed -n -e '\''s/^T .* \(.*\)$/extern int \1();/p'\'' -e '\''s/^[ABCDGIRSTW]* .* \(.*\)$/extern char \1;/p'\''' +lt_cv_sys_max_cmd_len=1966080 +lt_cv_to_host_file_cmd=func_convert_file_noop +lt_cv_to_tool_file_cmd=func_convert_file_noop + +## ----------------- ## +## Output variables. ## +## ----------------- ## + +ACLOCAL='${SHELL} /home/www/proj/jpeg-8c/missing --run aclocal-1.11' +AMDEPBACKSLASH='\' +AMDEP_FALSE='#' +AMDEP_TRUE='' +AMTAR='${SHELL} /home/www/proj/jpeg-8c/missing --run tar' +AM_BACKSLASH='\' +AM_DEFAULT_VERBOSITY='0' +ANSI2KNR='' +AR='ar' +AS='as' +AUTOCONF='${SHELL} /home/www/proj/jpeg-8c/missing --run autoconf' +AUTOHEADER='echo autoheader ignored' +AUTOMAKE='${SHELL} /home/www/proj/jpeg-8c/missing --run automake-1.11' +AWK='mawk' +CC='gcc -std=gnu99' +CCDEPMODE='depmode=gcc3' +CFLAGS='-g -O2' +CPP='gcc -E' +CPPFLAGS='' +CYGPATH_W='echo' +DEFS='-DHAVE_CONFIG_H' +DEPDIR='.deps' +DLLTOOL='dlltool' +DSYMUTIL='' +DUMPBIN='' +ECHO_C='' +ECHO_N='-n' +ECHO_T='' +EGREP='/bin/grep -E' +EXEEXT='' +FGREP='/bin/grep -F' +GREP='/bin/grep' +HAVE_LD_VERSION_SCRIPT_FALSE='#' +HAVE_LD_VERSION_SCRIPT_TRUE='' +INSTALL_DATA='${INSTALL} -m 644' +INSTALL_PROGRAM='${INSTALL}' +INSTALL_SCRIPT='${INSTALL}' +INSTALL_STRIP_PROGRAM='$(install_sh) -c -s' +JPEG_LIB_VERSION='11:0:3' +LD='/usr/bin/ld -m elf_x86_64' +LDFLAGS='' +LIBOBJS='' +LIBS='' +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +LIPO='' +LN_S='ln -s' +LTLIBOBJS='' +MAINT='#' +MAINTAINER_MODE_FALSE='' +MAINTAINER_MODE_TRUE='#' +MAKEINFO='${SHELL} /home/www/proj/jpeg-8c/missing --run makeinfo' +MANIFEST_TOOL=':' +MEMORYMGR='jmemnobs' +MKDIR_P='/bin/mkdir -p' +NM='/usr/bin/nm -B' +NMEDIT='' +OBJDUMP='objdump' +OBJEXT='o' +OTOOL64='' +OTOOL='' +PACKAGE='libjpeg' +PACKAGE_BUGREPORT='' +PACKAGE_NAME='libjpeg' +PACKAGE_STRING='libjpeg 8.3.0' +PACKAGE_TARNAME='libjpeg' +PACKAGE_URL='' +PACKAGE_VERSION='8.3.0' +PATH_SEPARATOR=':' +RANLIB='ranlib' +SED='/bin/sed' +SET_MAKE='' +SHELL='/bin/bash' +STRIP='strip' +U='' +VERSION='8.3.0' +ac_ct_AR='ar' +ac_ct_CC='gcc' +ac_ct_DUMPBIN='' +am__EXEEXT_FALSE='' +am__EXEEXT_TRUE='#' +am__fastdepCC_FALSE='#' +am__fastdepCC_TRUE='' +am__include='include' +am__isrc='' +am__leading_dot='.' +am__quote='' +am__tar='${AMTAR} chof - "$$tardir"' +am__untar='${AMTAR} xf -' +bindir='${exec_prefix}/bin' +build='x86_64-unknown-linux-gnu' +build_alias='' +build_cpu='x86_64' +build_os='linux-gnu' +build_vendor='unknown' +datadir='${datarootdir}' +datarootdir='${prefix}/share' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +dvidir='${docdir}' +exec_prefix='${prefix}' +host='x86_64-unknown-linux-gnu' +host_alias='' +host_cpu='x86_64' +host_os='linux-gnu' +host_vendor='unknown' +htmldir='${docdir}' +includedir='${prefix}/include' +infodir='${datarootdir}/info' +install_sh='${SHELL} /home/www/proj/jpeg-8c/install-sh' +libdir='${exec_prefix}/lib' +libexecdir='${exec_prefix}/libexec' +localedir='${datarootdir}/locale' +localstatedir='${prefix}/var' +mandir='${datarootdir}/man' +mkdir_p='/bin/mkdir -p' +oldincludedir='/usr/include' +pdfdir='${docdir}' +prefix='/usr/local' +program_transform_name='s,x,x,' +psdir='${docdir}' +sbindir='${exec_prefix}/sbin' +sharedstatedir='${prefix}/com' +sysconfdir='${prefix}/etc' +target='x86_64-unknown-linux-gnu' +target_alias='' +target_cpu='x86_64' +target_os='linux-gnu' +target_vendor='unknown' + +## ----------- ## +## confdefs.h. ## +## ----------- ## + +/* confdefs.h */ +#define PACKAGE_NAME "libjpeg" +#define PACKAGE_TARNAME "libjpeg" +#define PACKAGE_VERSION "8.3.0" +#define PACKAGE_STRING "libjpeg 8.3.0" +#define PACKAGE_BUGREPORT "" +#define PACKAGE_URL "" +#define PACKAGE "libjpeg" +#define VERSION "8.3.0" +#define PROTOTYPES 1 +#define __PROTOTYPES 1 +#define STDC_HEADERS 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_STRING_H 1 +#define HAVE_PROTOTYPES 1 +#define HAVE_STDDEF_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_LOCALE_H 1 +#define HAVE_UNSIGNED_CHAR 1 +#define HAVE_UNSIGNED_SHORT 1 +#define INLINE __inline__ +#define HAVE_DLFCN_H 1 +#define LT_OBJDIR ".libs/" + +configure: exit 0 diff --git a/jpeg-8c/config.status b/jpeg-8c/config.status new file mode 100755 index 00000000..5d6a25c6 --- /dev/null +++ b/jpeg-8c/config.status @@ -0,0 +1,2084 @@ +#! /bin/bash +# Generated by configure. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=${CONFIG_SHELL-/bin/bash} +export SHELL +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by libjpeg $as_me 8.3.0, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +# Files that config.status was made for. +config_files=" Makefile" +config_headers=" jconfig.h:jconfig.cfg" +config_commands=" depfiles libtool" + +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +ac_cs_config="" +ac_cs_version="\ +libjpeg config.status 8.3.0 +configured by ./configure, generated by GNU Autoconf 2.68, + with options \"$ac_cs_config\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='/home/www/proj/jpeg-8c' +srcdir='.' +INSTALL='/usr/bin/install -c' +MKDIR_P='/bin/mkdir -p' +AWK='mawk' +test -n "$AWK" || AWK=awk +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +if $ac_cs_recheck; then + set X '/bin/bash' './configure' $ac_configure_extra_args --no-create --no-recursion + shift + $as_echo "running CONFIG_SHELL=/bin/bash $*" >&6 + CONFIG_SHELL='/bin/bash' + export CONFIG_SHELL + exec "$@" +fi + +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +# +# INIT-COMMANDS +# +AMDEP_TRUE="" ac_aux_dir="." + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +double_quote_subst='s/\(["`\\]\)/\\\1/g' +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' +AS='as' +DLLTOOL='dlltool' +OBJDUMP='objdump' +macro_version='2.4' +macro_revision='1.3293' +enable_shared='yes' +enable_static='yes' +pic_mode='default' +enable_fast_install='yes' +SHELL='/bin/bash' +ECHO='printf %s\n' +host_alias='' +host='x86_64-unknown-linux-gnu' +host_os='linux-gnu' +build_alias='' +build='x86_64-unknown-linux-gnu' +build_os='linux-gnu' +SED='/bin/sed' +Xsed='/bin/sed -e 1s/^X//' +GREP='/bin/grep' +EGREP='/bin/grep -E' +FGREP='/bin/grep -F' +LD='/usr/bin/ld -m elf_x86_64' +NM='/usr/bin/nm -B' +LN_S='ln -s' +max_cmd_len='1966080' +ac_objext='o' +exeext='' +lt_unset='unset' +lt_SP2NL='tr \040 \012' +lt_NL2SP='tr \015\012 \040\040' +lt_cv_to_host_file_cmd='func_convert_file_noop' +lt_cv_to_tool_file_cmd='func_convert_file_noop' +reload_flag=' -r' +reload_cmds='$LD$reload_flag -o $output$reload_objs' +deplibs_check_method='pass_all' +file_magic_cmd='$MAGIC_CMD' +file_magic_glob='' +want_nocaseglob='no' +sharedlib_from_linklib_cmd='printf %s\n' +AR='ar' +AR_FLAGS='cru' +archiver_list_spec='@' +STRIP='strip' +RANLIB='ranlib' +old_postinstall_cmds='chmod 644 $oldlib~$RANLIB $oldlib' +old_postuninstall_cmds='' +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs~$RANLIB $oldlib' +lock_old_archive_extraction='no' +CC='gcc -std=gnu99' +CFLAGS='-g -O2' +compiler='gcc -std=gnu99' +GCC='yes' +lt_cv_sys_global_symbol_pipe='sed -n -e '\''s/^.*[ ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p'\'' | sed '\''/ __gnu_lto/d'\''' +lt_cv_sys_global_symbol_to_cdecl='sed -n -e '\''s/^T .* \(.*\)$/extern int \1();/p'\'' -e '\''s/^[ABCDGIRSTW]* .* \(.*\)$/extern char \1;/p'\''' +lt_cv_sys_global_symbol_to_c_name_address='sed -n -e '\''s/^: \([^ ]*\)[ ]*$/ {\"\1\", (void *) 0},/p'\'' -e '\''s/^[ABCDGIRSTW]* \([^ ]*\) \([^ ]*\)$/ {"\2", (void *) \&\2},/p'\''' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='sed -n -e '\''s/^: \([^ ]*\)[ ]*$/ {\"\1\", (void *) 0},/p'\'' -e '\''s/^[ABCDGIRSTW]* \([^ ]*\) \(lib[^ ]*\)$/ {"\2", (void *) \&\2},/p'\'' -e '\''s/^[ABCDGIRSTW]* \([^ ]*\) \([^ ]*\)$/ {"lib\2", (void *) \&\2},/p'\''' +nm_file_list_spec='@' +lt_sysroot='' +objdir='.libs' +MAGIC_CMD='file' +lt_prog_compiler_no_builtin_flag=' -fno-builtin' +lt_prog_compiler_pic=' -fPIC -DPIC' +lt_prog_compiler_wl='-Wl,' +lt_prog_compiler_static='-static' +lt_cv_prog_compiler_c_o='yes' +need_locks='no' +MANIFEST_TOOL=':' +DSYMUTIL='' +NMEDIT='' +LIPO='' +OTOOL='' +OTOOL64='' +libext='a' +shrext_cmds='.so' +extract_expsyms_cmds='' +archive_cmds_need_lc='no' +enable_shared_with_static_runtimes='no' +export_dynamic_flag_spec='${wl}--export-dynamic' +whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' +compiler_needs_object='no' +old_archive_from_new_cmds='' +old_archive_from_expsyms_cmds='' +archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' +module_cmds='' +module_expsym_cmds='' +with_gnu_ld='yes' +allow_undefined_flag='' +no_undefined_flag='' +hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +hardcode_libdir_flag_spec_ld='' +hardcode_libdir_separator='' +hardcode_direct='no' +hardcode_direct_absolute='no' +hardcode_minus_L='no' +hardcode_shlibpath_var='unsupported' +hardcode_automatic='no' +inherit_rpath='no' +link_all_deplibs='unknown' +always_export_symbols='no' +export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' +include_expsyms='' +prelink_cmds='' +postlink_cmds='' +file_list_spec='' +variables_saved_for_relink='PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH' +need_lib_prefix='no' +need_version='no' +version_type='linux' +runpath_var='LD_RUN_PATH' +shlibpath_var='LD_LIBRARY_PATH' +shlibpath_overrides_runpath='no' +libname_spec='lib$name' +library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +soname_spec='${libname}${release}${shared_ext}$major' +install_override_mode='' +postinstall_cmds='' +postuninstall_cmds='' +finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' +finish_eval='' +hardcode_into_libs='yes' +sys_lib_search_path_spec='/usr/lib/gcc/x86_64-linux-gnu/4.7 /usr/lib/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib ' +sys_lib_dlsearch_path_spec='/lib /usr/lib /usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu ' +hardcode_action='immediate' +enable_dlopen='unknown' +enable_dlopen_self='unknown' +enable_dlopen_self_static='unknown' +old_striplib='strip --strip-debug' +striplib='strip --strip-unneeded' + +LTCC='gcc -std=gnu99' +LTCFLAGS='-g -O2' +compiler='gcc -std=gnu99' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in AS DLLTOOL OBJDUMP SHELL ECHO SED GREP EGREP FGREP LD NM LN_S lt_SP2NL lt_NL2SP reload_flag deplibs_check_method file_magic_cmd file_magic_glob want_nocaseglob sharedlib_from_linklib_cmd AR AR_FLAGS archiver_list_spec STRIP RANLIB CC CFLAGS compiler lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl lt_cv_sys_global_symbol_to_c_name_address lt_cv_sys_global_symbol_to_c_name_address_lib_prefix nm_file_list_spec lt_prog_compiler_no_builtin_flag lt_prog_compiler_pic lt_prog_compiler_wl lt_prog_compiler_static lt_cv_prog_compiler_c_o need_locks MANIFEST_TOOL DSYMUTIL NMEDIT LIPO OTOOL OTOOL64 shrext_cmds export_dynamic_flag_spec whole_archive_flag_spec compiler_needs_object with_gnu_ld allow_undefined_flag no_undefined_flag hardcode_libdir_flag_spec hardcode_libdir_flag_spec_ld hardcode_libdir_separator exclude_expsyms include_expsyms file_list_spec variables_saved_for_relink libname_spec library_names_spec soname_spec install_override_mode finish_eval old_striplib striplib; do + case `eval \\$ECHO \\""\\$$var"\\"` in + *[\\\`\"\$]*) + eval "lt_$var=\\\"\`\$ECHO \"\$$var\" | \$SED \"\$sed_quote_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\$$var\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds old_postinstall_cmds old_postuninstall_cmds old_archive_cmds extract_expsyms_cmds old_archive_from_new_cmds old_archive_from_expsyms_cmds archive_cmds archive_expsym_cmds module_cmds module_expsym_cmds export_symbols_cmds prelink_cmds postlink_cmds postinstall_cmds postuninstall_cmds finish_cmds sys_lib_search_path_spec sys_lib_dlsearch_path_spec; do + case `eval \\$ECHO \\""\\$$var"\\"` in + *[\\\`\"\$]*) + eval "lt_$var=\\\"\`\$ECHO \"\$$var\" | \$SED -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\$$var\\\"" + ;; + esac +done + +ac_aux_dir='.' +xsi_shell='yes' +lt_shell_append='yes' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='libjpeg' + VERSION='8.3.0' + TIMESTAMP='' + RM='rm -f' + ofile='libtool' + + + + + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "jconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS jconfig.h:jconfig.cfg" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +cat >>"$ac_tmp/subs1.awk" <<\_ACAWK && +S["am__EXEEXT_FALSE"]="" +S["am__EXEEXT_TRUE"]="#" +S["LTLIBOBJS"]="" +S["LIBOBJS"]="" +S["JPEG_LIB_VERSION"]="11:0:3" +S["MEMORYMGR"]="jmemnobs" +S["OTOOL64"]="" +S["OTOOL"]="" +S["LIPO"]="" +S["NMEDIT"]="" +S["DSYMUTIL"]="" +S["MANIFEST_TOOL"]=":" +S["RANLIB"]="ranlib" +S["ac_ct_AR"]="ar" +S["AR"]="ar" +S["NM"]="/usr/bin/nm -B" +S["ac_ct_DUMPBIN"]="" +S["DUMPBIN"]="" +S["LD"]="/usr/bin/ld -m elf_x86_64" +S["FGREP"]="/bin/grep -F" +S["SED"]="/bin/sed" +S["LIBTOOL"]="$(SHELL) $(top_builddir)/libtool" +S["OBJDUMP"]="objdump" +S["DLLTOOL"]="dlltool" +S["AS"]="as" +S["HAVE_LD_VERSION_SCRIPT_FALSE"]="#" +S["HAVE_LD_VERSION_SCRIPT_TRUE"]="" +S["LN_S"]="ln -s" +S["MAINT"]="#" +S["MAINTAINER_MODE_FALSE"]="" +S["MAINTAINER_MODE_TRUE"]="#" +S["ANSI2KNR"]="" +S["U"]="" +S["EGREP"]="/bin/grep -E" +S["GREP"]="/bin/grep" +S["CPP"]="gcc -E" +S["am__fastdepCC_FALSE"]="#" +S["am__fastdepCC_TRUE"]="" +S["CCDEPMODE"]="depmode=gcc3" +S["AMDEPBACKSLASH"]="\\" +S["AMDEP_FALSE"]="#" +S["AMDEP_TRUE"]="" +S["am__quote"]="" +S["am__include"]="include" +S["DEPDIR"]=".deps" +S["OBJEXT"]="o" +S["EXEEXT"]="" +S["ac_ct_CC"]="gcc" +S["CPPFLAGS"]="" +S["LDFLAGS"]="" +S["CFLAGS"]="-g -O2" +S["CC"]="gcc -std=gnu99" +S["AM_BACKSLASH"]="\\" +S["AM_DEFAULT_VERBOSITY"]="0" +S["am__untar"]="${AMTAR} xf -" +S["am__tar"]="${AMTAR} chof - \"$$tardir\"" +S["AMTAR"]="${SHELL} /home/www/proj/jpeg-8c/missing --run tar" +S["am__leading_dot"]="." +S["SET_MAKE"]="" +S["AWK"]="mawk" +S["mkdir_p"]="/bin/mkdir -p" +S["MKDIR_P"]="/bin/mkdir -p" +S["INSTALL_STRIP_PROGRAM"]="$(install_sh) -c -s" +S["STRIP"]="strip" +S["install_sh"]="${SHELL} /home/www/proj/jpeg-8c/install-sh" +S["MAKEINFO"]="${SHELL} /home/www/proj/jpeg-8c/missing --run makeinfo" +S["AUTOHEADER"]="echo autoheader ignored" +S["AUTOMAKE"]="${SHELL} /home/www/proj/jpeg-8c/missing --run automake-1.11" +S["AUTOCONF"]="${SHELL} /home/www/proj/jpeg-8c/missing --run autoconf" +S["ACLOCAL"]="${SHELL} /home/www/proj/jpeg-8c/missing --run aclocal-1.11" +S["VERSION"]="8.3.0" +S["PACKAGE"]="libjpeg" +S["CYGPATH_W"]="echo" +S["am__isrc"]="" +S["INSTALL_DATA"]="${INSTALL} -m 644" +S["INSTALL_SCRIPT"]="${INSTALL}" +S["INSTALL_PROGRAM"]="${INSTALL}" +S["target_os"]="linux-gnu" +S["target_vendor"]="unknown" +S["target_cpu"]="x86_64" +S["target"]="x86_64-unknown-linux-gnu" +S["host_os"]="linux-gnu" +S["host_vendor"]="unknown" +S["host_cpu"]="x86_64" +S["host"]="x86_64-unknown-linux-gnu" +S["build_os"]="linux-gnu" +S["build_vendor"]="unknown" +S["build_cpu"]="x86_64" +S["build"]="x86_64-unknown-linux-gnu" +S["target_alias"]="" +S["host_alias"]="" +S["build_alias"]="" +S["LIBS"]="" +S["ECHO_T"]="" +S["ECHO_N"]="-n" +S["ECHO_C"]="" +S["DEFS"]="-DHAVE_CONFIG_H" +S["mandir"]="${datarootdir}/man" +S["localedir"]="${datarootdir}/locale" +S["libdir"]="${exec_prefix}/lib" +S["psdir"]="${docdir}" +S["pdfdir"]="${docdir}" +S["dvidir"]="${docdir}" +S["htmldir"]="${docdir}" +S["infodir"]="${datarootdir}/info" +S["docdir"]="${datarootdir}/doc/${PACKAGE_TARNAME}" +S["oldincludedir"]="/usr/include" +S["includedir"]="${prefix}/include" +S["localstatedir"]="${prefix}/var" +S["sharedstatedir"]="${prefix}/com" +S["sysconfdir"]="${prefix}/etc" +S["datadir"]="${datarootdir}" +S["datarootdir"]="${prefix}/share" +S["libexecdir"]="${exec_prefix}/libexec" +S["sbindir"]="${exec_prefix}/sbin" +S["bindir"]="${exec_prefix}/bin" +S["program_transform_name"]="s,x,x," +S["prefix"]="/usr/local" +S["exec_prefix"]="${prefix}" +S["PACKAGE_URL"]="" +S["PACKAGE_BUGREPORT"]="" +S["PACKAGE_STRING"]="libjpeg 8.3.0" +S["PACKAGE_VERSION"]="8.3.0" +S["PACKAGE_TARNAME"]="libjpeg" +S["PACKAGE_NAME"]="libjpeg" +S["PATH_SEPARATOR"]=":" +S["SHELL"]="/bin/bash" +_ACAWK +cat >>"$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +D["PACKAGE_NAME"]=" \"libjpeg\"" +D["PACKAGE_TARNAME"]=" \"libjpeg\"" +D["PACKAGE_VERSION"]=" \"8.3.0\"" +D["PACKAGE_STRING"]=" \"libjpeg 8.3.0\"" +D["PACKAGE_BUGREPORT"]=" \"\"" +D["PACKAGE_URL"]=" \"\"" +D["PACKAGE"]=" \"libjpeg\"" +D["VERSION"]=" \"8.3.0\"" +D["PROTOTYPES"]=" 1" +D["__PROTOTYPES"]=" 1" +D["STDC_HEADERS"]=" 1" +D["HAVE_SYS_TYPES_H"]=" 1" +D["HAVE_SYS_STAT_H"]=" 1" +D["HAVE_STDLIB_H"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE_MEMORY_H"]=" 1" +D["HAVE_STRINGS_H"]=" 1" +D["HAVE_INTTYPES_H"]=" 1" +D["HAVE_STDINT_H"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE_PROTOTYPES"]=" 1" +D["HAVE_STDDEF_H"]=" 1" +D["HAVE_STDLIB_H"]=" 1" +D["HAVE_LOCALE_H"]=" 1" +D["HAVE_UNSIGNED_CHAR"]=" 1" +D["HAVE_UNSIGNED_SHORT"]=" 1" +D["INLINE"]=" __inline__" +D["HAVE_DLFCN_H"]=" 1" +D["LT_OBJDIR"]=" \".libs/\"" + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+[_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*([\t (]|$)/ { + line = $ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + ac_datarootdir_hack=' + s&@datadir@&${datarootdir}&g + s&@docdir@&${datarootdir}/doc/${PACKAGE_TARNAME}&g + s&@infodir@&${datarootdir}/info&g + s&@localedir@&${datarootdir}/locale&g + s&@mandir@&${datarootdir}/man&g + s&\${datarootdir}&${prefix}/share&g' ;; +esac +ac_sed_extra="/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +} + +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="" + +# ### BEGIN LIBTOOL CONFIG + +# Assembler program. +AS=$lt_AS + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Object dumper program. +OBJDUMP=$lt_OBJDUMP + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 diff --git a/jpeg-8c/config.sub b/jpeg-8c/config.sub new file mode 100755 index 00000000..2a55a507 --- /dev/null +++ b/jpeg-8c/config.sub @@ -0,0 +1,1705 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +# Free Software Foundation, Inc. + +timestamp='2009-11-20' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | picochip) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/jpeg-8c/configure b/jpeg-8c/configure new file mode 100755 index 00000000..97b17b19 --- /dev/null +++ b/jpeg-8c/configure @@ -0,0 +1,15870 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.68 for libjpeg 8.3.0. +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + # Preserve -v and -x to the replacement shell. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; + esac + exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='libjpeg' +PACKAGE_TARNAME='libjpeg' +PACKAGE_VERSION='8.3.0' +PACKAGE_STRING='libjpeg 8.3.0' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +JPEG_LIB_VERSION +MEMORYMGR +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +SED +LIBTOOL +OBJDUMP +DLLTOOL +AS +HAVE_LD_VERSION_SCRIPT_FALSE +HAVE_LD_VERSION_SCRIPT_TRUE +LN_S +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +ANSI2KNR +U +EGREP +GREP +CPP +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_os +target_vendor +target_cpu +target +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +enable_maintainer_mode +enable_ld_version_script +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +with_sysroot +enable_libtool_lock +enable_maxmem +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +CPPFLAGS +CC +LDFLAGS +LIBS +CPPFLAGS +CPP +CPPFLAGS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures libjpeg 8.3.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/libjpeg] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of libjpeg 8.3.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: `make V=1') + --disable-silent-rules verbose build output (undo: `make V=0') + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer + --enable-ld-version-script + enable linker version script (default is enabled + when possible) + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-maxmem=N enable use of temp files, set max mem usage to N MB + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot=DIR Search for dependent libraries within DIR + (or the compiler's sysroot if not specified). + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +libjpeg configure 8.3.0 +generated by GNU Autoconf 2.68 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by libjpeg $as_me 8.3.0, which was +generated by GNU Autoconf 2.68. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Directory where autotools helper scripts lives. +ac_aux_dir= +for ac_dir in . "$srcdir"/.; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in . \"$srcdir\"/." "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + +# Generate configuration headers. +ac_config_headers="$ac_config_headers jconfig.h:jconfig.cfg" + + +# Hack: disable autoheader so that it doesn't overwrite our cfg template. +AUTOHEADER="echo autoheader ignored" + +# Check system type +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 +$as_echo_n "checking target system type... " >&6; } +if ${ac_cv_target+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host +else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 +$as_echo "$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; +esac +target=$ac_cv_target +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_target +shift +target_cpu=$1 +target_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +target_os=$* +IFS=$ac_save_IFS +case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac + + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + +# Initialize Automake +# Don't require all the GNU mandated files +am__api_version='1.11' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='libjpeg' + VERSION='8.3.0' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + + +# Make --enable-silent-rules the default. +# To get verbose build output you may configure +# with --disable-silent-rules or use "make V=1". +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in +yes) AM_DEFAULT_VERBOSITY=0;; +no) AM_DEFAULT_VERBOSITY=1;; +*) AM_DEFAULT_VERBOSITY=0;; +esac +AM_BACKSLASH='\' + + +# This is required when using the de-ANSI-fication feature. +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for function prototypes" >&5 +$as_echo_n "checking for function prototypes... " >&6; } +if test "$ac_cv_prog_cc_c89" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define PROTOTYPES 1" >>confdefs.h + + +$as_echo "#define __PROTOTYPES 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +if test "$ac_cv_prog_cc_stdc" != no; then + U= ANSI2KNR= +else + U=_ ANSI2KNR=./ansi2knr +fi +# Ensure some checks needed by ansi2knr itself. + +for ac_header in string.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" +if test "x$ac_cv_header_string_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRING_H 1 +_ACEOF + +fi + +done + + + +# Add configure option --enable-maintainer-mode which enables +# dependency checking and generation useful to package maintainers. +# This is made an option to avoid confusing end users. + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + +# Check for programs +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + case $ac_cv_prog_cc_stdc in #( + no) : + ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 +$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } +if ${ac_cv_prog_cc_c99+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +#include + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +#define debug(...) fprintf (stderr, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + your preprocessor is broken; +#endif +#if BIG_OK +#else + your preprocessor is broken; +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\0'; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static void +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str; + int number; + float fnumber; + + while (*format) + { + switch (*format++) + { + case 's': // string + str = va_arg (args_copy, const char *); + break; + case 'd': // int + number = va_arg (args_copy, int); + break; + case 'f': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); +} + +int +main () +{ + + // Check bool. + _Bool success = false; + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + test_varargs ("s, d' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' + || dynamic_array[ni.number - 1] != 543); + + ; + return 0; +} +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c99" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c99" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c99" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 +else + ac_cv_prog_cc_stdc=no +fi + +fi + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5 +$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; } + if ${ac_cv_prog_cc_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +fi + + case $ac_cv_prog_cc_stdc in #( + no) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; #( + '') : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5 +$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;; +esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + + +# Check if LD supports linker scripts, +# and define automake conditional HAVE_LD_VERSION_SCRIPT if so. +# Check whether --enable-ld-version-script was given. +if test "${enable_ld_version_script+set}" = set; then : + enableval=$enable_ld_version_script; have_ld_version_script=$enableval +fi + +if test -z "$have_ld_version_script"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if LD -Wl,--version-script works" >&5 +$as_echo_n "checking if LD -Wl,--version-script works... " >&6; } + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" + cat > conftest.map <conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + have_ld_version_script=yes +else + have_ld_version_script=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + rm -f conftest.map + LDFLAGS="$save_LDFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_ld_version_script" >&5 +$as_echo "$have_ld_version_script" >&6; } +fi + if test "$have_ld_version_script" = "yes"; then + HAVE_LD_VERSION_SCRIPT_TRUE= + HAVE_LD_VERSION_SCRIPT_FALSE='#' +else + HAVE_LD_VERSION_SCRIPT_TRUE='#' + HAVE_LD_VERSION_SCRIPT_FALSE= +fi + + +# See if compiler supports prototypes. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for function prototypes" >&5 +$as_echo_n "checking for function prototypes... " >&6; } +if ${ijg_cv_have_prototypes+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int testfunction (int arg1, int * arg2); /* check prototypes */ +struct methods_struct { /* check method-pointer declarations */ + int (*error_exit) (char *msgtext); + int (*trace_message) (char *msgtext); + int (*another_method) (void); +}; +int testfunction (int arg1, int * arg2) /* check definitions */ +{ return arg2[arg1]; } +int test2function (void) /* check void arg list */ +{ return 0; } + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ijg_cv_have_prototypes=yes +else + ijg_cv_have_prototypes=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ijg_cv_have_prototypes" >&5 +$as_echo "$ijg_cv_have_prototypes" >&6; } +if test $ijg_cv_have_prototypes = yes; then + +$as_echo "#define HAVE_PROTOTYPES 1" >>confdefs.h + +else + echo Your compiler does not seem to know about function prototypes. + echo Perhaps it needs a special switch to enable ANSI C mode. + echo If so, we recommend running configure like this: + echo " ./configure CC='cc -switch'" + echo where -switch is the proper switch. +fi + +# Check header files +for ac_header in stddef.h stdlib.h locale.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" +if test "x$ac_cv_header_string_h" = xyes; then : + +else + +$as_echo "#define NEED_BSD_STRINGS 1" >>confdefs.h + +fi + + + +# See whether type size_t is defined in any ANSI-standard places; +# if not, perhaps it is defined in . +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for size_t" >&5 +$as_echo_n "checking for size_t... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef HAVE_STDDEF_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#ifdef NEED_BSD_STRINGS +#include +#else +#include +#endif +typedef size_t my_size_t; + +int +main () +{ + my_size_t foovar; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ijg_size_t_ok=yes +else + ijg_size_t_ok="not ANSI, perhaps it is in sys/types.h" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ijg_size_t_ok" >&5 +$as_echo "$ijg_size_t_ok" >&6; } +if test "$ijg_size_t_ok" != yes; then +ac_fn_c_check_header_mongrel "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_types_h" = xyes; then : + +$as_echo "#define NEED_SYS_TYPES_H 1" >>confdefs.h + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "size_t" >/dev/null 2>&1; then : + ijg_size_t_ok="size_t is in sys/types.h" +else + ijg_size_t_ok=no +fi +rm -f conftest* + +else + ijg_size_t_ok=no +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ijg_size_t_ok" >&5 +$as_echo "$ijg_size_t_ok" >&6; } +if test "$ijg_size_t_ok" = no; then + echo Type size_t is not defined in any of the usual places. + echo Try putting '"typedef unsigned int size_t;"' in jconfig.h. +fi +fi + +# Check compiler characteristics +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for type unsigned char" >&5 +$as_echo_n "checking for type unsigned char... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + unsigned char un_char; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define HAVE_UNSIGNED_CHAR 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for type unsigned short" >&5 +$as_echo_n "checking for type unsigned short... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + unsigned short un_short; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define HAVE_UNSIGNED_SHORT 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for type void" >&5 +$as_echo_n "checking for type void... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Caution: a C++ compiler will insist on valid prototypes */ +typedef void * void_ptr; /* check void * */ +#ifdef HAVE_PROTOTYPES /* check ptr to function returning void */ +typedef void (*void_func) (int a, int b); +#else +typedef void (*void_func) (); +#endif + +#ifdef HAVE_PROTOTYPES /* check void function result */ +void test3function (void_ptr arg1, void_func arg2) +#else +void test3function (arg1, arg2) + void_ptr arg1; + void_func arg2; +#endif +{ + char * locptr = (char *) arg1; /* check casting to and from void * */ + arg1 = (void *) locptr; + (*arg2) (1, 2); /* check call of fcn returning void */ +} + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "#define void char" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + + +# Check for non-broken inline under various spellings +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +ijg_cv_inline="" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +} __inline__ int foo() { return 0; } +int bar() { return foo(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ijg_cv_inline="__inline__" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +} __inline int foo() { return 0; } +int bar() { return foo(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ijg_cv_inline="__inline" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +} inline int foo() { return 0; } +int bar() { return foo(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ijg_cv_inline="inline" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ijg_cv_inline" >&5 +$as_echo "$ijg_cv_inline" >&6; } + +cat >>confdefs.h <<_ACEOF +#define INLINE $ijg_cv_inline +_ACEOF + + +# We cannot check for bogus warnings, but at least we can check for errors +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken incomplete types" >&5 +$as_echo_n "checking for broken incomplete types... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + typedef struct undefined_structure * undef_struct_ptr; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: broken" >&5 +$as_echo "broken" >&6; } + +$as_echo "#define INCOMPLETE_TYPES_BROKEN 1" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +# Test whether global names are unique to at least 15 chars +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for short external names" >&5 +$as_echo_n "checking for short external names... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int possibly_duplicate_function () { return 0; } +int possibly_dupli_function () { return 1; } + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: short" >&5 +$as_echo "short" >&6; } + +$as_echo "#define NEED_SHORT_EXTERNAL_NAMES 1" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +# Run-time checks +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if char is signed" >&5 +$as_echo_n "checking to see if char is signed... " >&6; } +if test "$cross_compiling" = yes; then : + echo Assuming that char is signed on target machine. +echo If it is unsigned, this will be a little bit inefficient. + +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef HAVE_PROTOTYPES +int is_char_signed (int arg) +#else +int is_char_signed (arg) + int arg; +#endif +{ + if (arg == 189) { /* expected result for unsigned char */ + return 0; /* type char is unsigned */ + } + else if (arg != -67) { /* expected result for signed char */ + printf("Hmm, it seems 'char' is not eight bits wide on your machine.\n"); + printf("I fear the JPEG software will not work at all.\n\n"); + } + return 1; /* assume char is signed otherwise */ +} +char signed_char_check = (char) (-67); +int main() { + exit(is_char_signed((int) signed_char_check)); +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "#define CHAR_IS_UNSIGNED 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if right shift is signed" >&5 +$as_echo_n "checking to see if right shift is signed... " >&6; } +if test "$cross_compiling" = yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Assuming that right shift is signed on target machine." >&5 +$as_echo "Assuming that right shift is signed on target machine." >&6; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef HAVE_PROTOTYPES +int is_shifting_signed (long arg) +#else +int is_shifting_signed (arg) + long arg; +#endif +/* See whether right-shift on a long is signed or not. */ +{ + long res = arg >> 4; + + if (res == -0x7F7E80CL) { /* expected result for signed shift */ + return 1; /* right shift is signed */ + } + /* see if unsigned-shift hack will fix it. */ + /* we can't just test exact value since it depends on width of long... */ + res |= (~0L) << (32-4); + if (res == -0x7F7E80CL) { /* expected result now? */ + return 0; /* right shift is unsigned */ + } + printf("Right shift isn't acting as I expect it to.\n"); + printf("I fear the JPEG software will not work at all.\n\n"); + return 0; /* try it with unsigned anyway */ +} +int main() { + exit(is_shifting_signed(-0x7F7E80B1L)); +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "#define RIGHT_SHIFT_IS_UNSIGNED 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if fopen accepts b spec" >&5 +$as_echo_n "checking to see if fopen accepts b spec... " >&6; } +if test "$cross_compiling" = yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Assuming that it does." >&5 +$as_echo "Assuming that it does." >&6; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +int main() { + if (fopen("conftestdata", "wb") != NULL) + exit(0); + exit(1); +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "#define DONT_USE_B_MODE 1" >>confdefs.h + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +# Configure libtool +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AS="${ac_tool_prefix}as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +$as_echo "$AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AS="as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +$as_echo "$ac_ct_AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4' +macro_revision='1.3293' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case "$ECHO" in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +$as_echo "${with_sysroot}" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options + + + + enable_dlopen=no + + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; pic_mode="$withval" +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + lt_prog_compiler_pic='-Xcompiler -fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ F* | *Sun*Fortran*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='${wl}--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld='-rpath $libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test x"$lt_cv_prog_compiler__b" = xyes; then + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([A-Za-z]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +# Select memory manager depending on user input. +# If no "-enable-maxmem", use jmemnobs +MEMORYMGR='jmemnobs' +MAXMEM="no" +# Check whether --enable-maxmem was given. +if test "${enable_maxmem+set}" = set; then : + enableval=$enable_maxmem; MAXMEM="$enableval" +fi + +if test "x$MAXMEM" = xyes; then + MAXMEM=1 +fi +if test "x$MAXMEM" != xno; then + if test -n "`echo $MAXMEM | sed 's/[0-9]//g'`"; then + as_fn_error $? "non-numeric argument to --enable-maxmem" "$LINENO" 5 + fi + DEFAULTMAXMEM=`expr $MAXMEM \* 1048576` + +cat >>confdefs.h <<_ACEOF +#define DEFAULT_MAX_MEM ${DEFAULTMAXMEM} +_ACEOF + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for 'tmpfile()'" >&5 +$as_echo_n "checking for 'tmpfile()'... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + FILE * tfile = tmpfile(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +MEMORYMGR='jmemansi' +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +MEMORYMGR='jmemname' + +# Test for the need to remove temporary files using a signal handler (for cjpeg/djpeg) + +$as_echo "#define NEED_SIGNAL_CATCHER 1" >>confdefs.h + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for 'mktemp()'" >&5 +$as_echo_n "checking for 'mktemp()'... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + char fname[80]; mktemp(fname); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "#define NO_MKTEMP 1" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + + +# Extract the library version IDs from jpeglib.h. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking libjpeg version number" >&5 +$as_echo_n "checking libjpeg version number... " >&6; } +JPEG_LIB_VERSION_MAJOR=`sed -e '/^#define JPEG_LIB_VERSION_MAJOR/!d' -e 's/^[^0-9]*\([0-9][0-9]*\).*$/\1/' $srcdir/jpeglib.h` +JPEG_LIB_VERSION_MINOR=`sed -e '/^#define JPEG_LIB_VERSION_MINOR/!d' -e 's/^[^0-9]*\([0-9][0-9]*\).*$/\1/' $srcdir/jpeglib.h` +JPEG_LIB_VERSION="`expr $JPEG_LIB_VERSION_MAJOR + $JPEG_LIB_VERSION_MINOR`:0:$JPEG_LIB_VERSION_MINOR" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $JPEG_LIB_VERSION" >&5 +$as_echo "$JPEG_LIB_VERSION" >&6; } + + +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_LD_VERSION_SCRIPT_TRUE}" && test -z "${HAVE_LD_VERSION_SCRIPT_FALSE}"; then + as_fn_error $? "conditional \"HAVE_LD_VERSION_SCRIPT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by libjpeg $as_me 8.3.0, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +libjpeg config.status 8.3.0 +configured by $0, generated by GNU Autoconf 2.68, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in AS \ +DLLTOOL \ +OBJDUMP \ +SHELL \ +ECHO \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +nm_file_list_spec \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_flag_spec_ld \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "jconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS jconfig.h:jconfig.cfg" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="" + +# ### BEGIN LIBTOOL CONFIG + +# Assembler program. +AS=$lt_AS + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Object dumper program. +OBJDUMP=$lt_OBJDUMP + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/jpeg-8c/configure.ac b/jpeg-8c/configure.ac new file mode 100644 index 00000000..e2c37741 --- /dev/null +++ b/jpeg-8c/configure.ac @@ -0,0 +1,318 @@ +# IJG auto-configuration source file. +# Process this file with autoconf to produce a configure script. + +# +# Configure script for IJG libjpeg +# + +AC_INIT([libjpeg], [8.3.0]) + +# Directory where autotools helper scripts lives. +AC_CONFIG_AUX_DIR([.]) + +# Generate configuration headers. +AC_CONFIG_HEADERS([jconfig.h:jconfig.cfg]) + +# Hack: disable autoheader so that it doesn't overwrite our cfg template. +AUTOHEADER="echo autoheader ignored" + +# Check system type +AC_CANONICAL_TARGET + +# Initialize Automake +# Don't require all the GNU mandated files +AM_INIT_AUTOMAKE([-Wall -Werror ansi2knr no-dist foreign]) + +# Make --enable-silent-rules the default. +# To get verbose build output you may configure +# with --disable-silent-rules or use "make V=1". +AM_SILENT_RULES([yes]) + +# This is required when using the de-ANSI-fication feature. +AM_C_PROTOTYPES + +# Add configure option --enable-maintainer-mode which enables +# dependency checking and generation useful to package maintainers. +# This is made an option to avoid confusing end users. +AM_MAINTAINER_MODE + +# Check for programs +AC_PROG_CC +AC_PROG_CC_STDC +AC_PROG_CPP +AC_PROG_INSTALL +AC_PROG_MAKE_SET +AC_PROG_LN_S + +# Check if LD supports linker scripts, +# and define automake conditional HAVE_LD_VERSION_SCRIPT if so. +AC_ARG_ENABLE([ld-version-script], + AS_HELP_STRING([--enable-ld-version-script], + [enable linker version script (default is enabled when possible)]), + [have_ld_version_script=$enableval], []) +if test -z "$have_ld_version_script"; then + AC_MSG_CHECKING([if LD -Wl,--version-script works]) + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" + cat > conftest.map < rather than standard .])) + +# See whether type size_t is defined in any ANSI-standard places; +# if not, perhaps it is defined in . +AC_MSG_CHECKING(for size_t) +AC_TRY_COMPILE([ +#ifdef HAVE_STDDEF_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#ifdef NEED_BSD_STRINGS +#include +#else +#include +#endif +typedef size_t my_size_t; +], [ my_size_t foovar; ], ijg_size_t_ok=yes, +[ijg_size_t_ok="not ANSI, perhaps it is in sys/types.h"]) +AC_MSG_RESULT($ijg_size_t_ok) +if test "$ijg_size_t_ok" != yes; then +AC_CHECK_HEADER(sys/types.h, [AC_DEFINE([NEED_SYS_TYPES_H],[1],[Need to include in order to obtain size_t.]) +AC_EGREP_CPP(size_t, [#include ], +[ijg_size_t_ok="size_t is in sys/types.h"], ijg_size_t_ok=no)], +ijg_size_t_ok=no) +AC_MSG_RESULT($ijg_size_t_ok) +if test "$ijg_size_t_ok" = no; then + echo Type size_t is not defined in any of the usual places. + echo Try putting '"typedef unsigned int size_t;"' in jconfig.h. +fi +fi + +# Check compiler characteristics +AC_MSG_CHECKING(for type unsigned char) +AC_TRY_COMPILE(, [ unsigned char un_char; ], +[AC_MSG_RESULT(yes) +AC_DEFINE([HAVE_UNSIGNED_CHAR],[1],[Compiler supports 'unsigned char'.])], AC_MSG_RESULT(no)) +dnl +AC_MSG_CHECKING(for type unsigned short) +AC_TRY_COMPILE(, [ unsigned short un_short; ], +[AC_MSG_RESULT(yes) +AC_DEFINE([HAVE_UNSIGNED_SHORT],[1],[Compiler supports 'unsigned short'.])], AC_MSG_RESULT(no)) +dnl +AC_MSG_CHECKING(for type void) +AC_TRY_COMPILE([ +/* Caution: a C++ compiler will insist on valid prototypes */ +typedef void * void_ptr; /* check void * */ +#ifdef HAVE_PROTOTYPES /* check ptr to function returning void */ +typedef void (*void_func) (int a, int b); +#else +typedef void (*void_func) (); +#endif + +#ifdef HAVE_PROTOTYPES /* check void function result */ +void test3function (void_ptr arg1, void_func arg2) +#else +void test3function (arg1, arg2) + void_ptr arg1; + void_func arg2; +#endif +{ + char * locptr = (char *) arg1; /* check casting to and from void * */ + arg1 = (void *) locptr; + (*arg2) (1, 2); /* check call of fcn returning void */ +} +], [ ], AC_MSG_RESULT(yes), [AC_MSG_RESULT(no) +AC_DEFINE([void],[char],[Define 'void' as 'char' for archaic compilers that don't understand it.])]) +AC_C_CONST + +# Check for non-broken inline under various spellings +AC_MSG_CHECKING(for inline) +ijg_cv_inline="" +AC_TRY_COMPILE(, [} __inline__ int foo() { return 0; } +int bar() { return foo();], ijg_cv_inline="__inline__", +AC_TRY_COMPILE(, [} __inline int foo() { return 0; } +int bar() { return foo();], ijg_cv_inline="__inline", +AC_TRY_COMPILE(, [} inline int foo() { return 0; } +int bar() { return foo();], ijg_cv_inline="inline"))) +AC_MSG_RESULT($ijg_cv_inline) +AC_DEFINE_UNQUOTED([INLINE],[$ijg_cv_inline],[How to obtain function inlining.]) + +# We cannot check for bogus warnings, but at least we can check for errors +AC_MSG_CHECKING(for broken incomplete types) +AC_TRY_COMPILE([ typedef struct undefined_structure * undef_struct_ptr; ], , +AC_MSG_RESULT(ok), +[AC_MSG_RESULT(broken) +AC_DEFINE([INCOMPLETE_TYPES_BROKEN],[1],[Compiler does not support pointers to unspecified structures.])]) + +# Test whether global names are unique to at least 15 chars +AC_MSG_CHECKING(for short external names) +AC_TRY_LINK([ +int possibly_duplicate_function () { return 0; } +int possibly_dupli_function () { return 1; } +], [ ], AC_MSG_RESULT(ok), [AC_MSG_RESULT(short) +AC_DEFINE([NEED_SHORT_EXTERNAL_NAMES],[1],[Linker requires that global names be unique in first 15 characters.])]) + +# Run-time checks +AC_MSG_CHECKING(to see if char is signed) +AC_TRY_RUN([ +#ifdef HAVE_PROTOTYPES +int is_char_signed (int arg) +#else +int is_char_signed (arg) + int arg; +#endif +{ + if (arg == 189) { /* expected result for unsigned char */ + return 0; /* type char is unsigned */ + } + else if (arg != -67) { /* expected result for signed char */ + printf("Hmm, it seems 'char' is not eight bits wide on your machine.\n"); + printf("I fear the JPEG software will not work at all.\n\n"); + } + return 1; /* assume char is signed otherwise */ +} +char signed_char_check = (char) (-67); +int main() { + exit(is_char_signed((int) signed_char_check)); +}], [AC_MSG_RESULT(no) +AC_DEFINE([CHAR_IS_UNSIGNED],[1],[Characters are unsigned])], AC_MSG_RESULT(yes), +[echo Assuming that char is signed on target machine. +echo If it is unsigned, this will be a little bit inefficient. +]) +dnl +AC_MSG_CHECKING(to see if right shift is signed) +AC_TRY_RUN([ +#ifdef HAVE_PROTOTYPES +int is_shifting_signed (long arg) +#else +int is_shifting_signed (arg) + long arg; +#endif +/* See whether right-shift on a long is signed or not. */ +{ + long res = arg >> 4; + + if (res == -0x7F7E80CL) { /* expected result for signed shift */ + return 1; /* right shift is signed */ + } + /* see if unsigned-shift hack will fix it. */ + /* we can't just test exact value since it depends on width of long... */ + res |= (~0L) << (32-4); + if (res == -0x7F7E80CL) { /* expected result now? */ + return 0; /* right shift is unsigned */ + } + printf("Right shift isn't acting as I expect it to.\n"); + printf("I fear the JPEG software will not work at all.\n\n"); + return 0; /* try it with unsigned anyway */ +} +int main() { + exit(is_shifting_signed(-0x7F7E80B1L)); +}], [AC_MSG_RESULT(no) +AC_DEFINE([RIGHT_SHIFT_IS_UNSIGNED],[1],[Broken compiler shifts signed values as an unsigned shift.])], AC_MSG_RESULT(yes), +AC_MSG_RESULT(Assuming that right shift is signed on target machine.)) +dnl +AC_MSG_CHECKING(to see if fopen accepts b spec) +AC_TRY_RUN([ +#include +int main() { + if (fopen("conftestdata", "wb") != NULL) + exit(0); + exit(1); +}], AC_MSG_RESULT(yes), [AC_MSG_RESULT(no) +AC_DEFINE([DONT_USE_B_MODE],[1],[Don't open files in binary mode.])], +AC_MSG_RESULT(Assuming that it does.)) + +# Configure libtool +AC_LIBTOOL_WIN32_DLL +AC_PROG_LIBTOOL + +# Select memory manager depending on user input. +# If no "-enable-maxmem", use jmemnobs +MEMORYMGR='jmemnobs' +MAXMEM="no" +AC_ARG_ENABLE(maxmem, +[ --enable-maxmem[=N] enable use of temp files, set max mem usage to N MB], +MAXMEM="$enableval") +dnl [# support --with-maxmem for backwards compatibility with IJG V5.] +dnl AC_ARG_WITH(maxmem, , MAXMEM="$withval") +if test "x$MAXMEM" = xyes; then + MAXMEM=1 +fi +if test "x$MAXMEM" != xno; then + if test -n "`echo $MAXMEM | sed 's/[[0-9]]//g'`"; then + AC_MSG_ERROR(non-numeric argument to --enable-maxmem) + fi + DEFAULTMAXMEM=`expr $MAXMEM \* 1048576` +AC_DEFINE_UNQUOTED([DEFAULT_MAX_MEM], [${DEFAULTMAXMEM}], [Maximum data space library will allocate.]) +AC_MSG_CHECKING([for 'tmpfile()']) +AC_TRY_LINK([#include ], [ FILE * tfile = tmpfile(); ], +[AC_MSG_RESULT(yes) +MEMORYMGR='jmemansi'], +[AC_MSG_RESULT(no) +dnl if tmpfile is not present, must use jmemname. +MEMORYMGR='jmemname' + +# Test for the need to remove temporary files using a signal handler (for cjpeg/djpeg) +AC_DEFINE([NEED_SIGNAL_CATCHER],[1],[Need signal handler to clean up temporary files.]) +AC_MSG_CHECKING([for 'mktemp()']) +AC_TRY_LINK(, [ char fname[80]; mktemp(fname); ], AC_MSG_RESULT(yes), +[AC_MSG_RESULT(no) +AC_DEFINE([NO_MKTEMP],[1],[The mktemp() function is not available.])])]) +fi +AC_SUBST(MEMORYMGR) + +# Extract the library version IDs from jpeglib.h. +AC_MSG_CHECKING([libjpeg version number]) +[JPEG_LIB_VERSION_MAJOR=`sed -e '/^#define JPEG_LIB_VERSION_MAJOR/!d' -e 's/^[^0-9]*\([0-9][0-9]*\).*$/\1/' $srcdir/jpeglib.h`] +[JPEG_LIB_VERSION_MINOR=`sed -e '/^#define JPEG_LIB_VERSION_MINOR/!d' -e 's/^[^0-9]*\([0-9][0-9]*\).*$/\1/' $srcdir/jpeglib.h`] +[JPEG_LIB_VERSION="`expr $JPEG_LIB_VERSION_MAJOR + $JPEG_LIB_VERSION_MINOR`:0:$JPEG_LIB_VERSION_MINOR"] +AC_MSG_RESULT([$JPEG_LIB_VERSION]) +AC_SUBST([JPEG_LIB_VERSION]) + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/jpeg-8c/depcomp b/jpeg-8c/depcomp new file mode 100755 index 00000000..df8eea7e --- /dev/null +++ b/jpeg-8c/depcomp @@ -0,0 +1,630 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free +# Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u="sed s,\\\\\\\\,/,g" + depmode=msvisualcpp +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> "$depfile" + echo >> "$depfile" + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/jpeg-8c/djpeg b/jpeg-8c/djpeg new file mode 100755 index 00000000..d23651c8 --- /dev/null +++ b/jpeg-8c/djpeg @@ -0,0 +1,225 @@ +#! /bin/bash + +# djpeg - temporary wrapper script for .libs/djpeg +# Generated by libtool (GNU libtool) 2.4 +# +# The djpeg program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command="(cd /home/www/proj/jpeg-8c; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH; gcc -std=gnu99 -g -O2 -o \$progdir/\$file djpeg.o wrppm.o wrgif.o wrtarga.o wrrle.o wrbmp.o rdcolmap.o cdjpeg.o ./.libs/libjpeg.so -Wl,-rpath -Wl,/home/www/proj/jpeg-8c/.libs)" + +# This environment variable determines our operation mode. +if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then + # install mode needs the following variables: + generated_by_libtool_version='2.4' + notinst_deplibs=' libjpeg.la' +else + # When we are sourced in execute mode, $file and $ECHO are already set. + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + file="$0" + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + ECHO="printf %s\\n" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string --lt- +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's ./libtool value, followed by no. +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=$0 + shift + for lt_opt + do + case "$lt_opt" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'` + test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=. + lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'` + cat "$lt_dump_D/$lt_dump_F" + exit 0 + ;; + --lt-*) + $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n "$lt_option_debug"; then + echo "djpeg:djpeg:${LINENO}: libtool wrapper (GNU libtool) 2.4" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + $ECHO "djpeg:djpeg:${LINENO}: newargv[$lt_dump_args_N]: $lt_arg" + lt_dump_args_N=`expr $lt_dump_args_N + 1` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ + + if test -n "$lt_option_debug"; then + $ECHO "djpeg:djpeg:${LINENO}: newargv[0]: $progdir/$program" 1>&2 + func_lt_dump_args ${1+"$@"} 1>&2 + fi + exec "$progdir/$program" ${1+"$@"} + + $ECHO "$0: cannot exec $program $*" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from $@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + for lt_wr_arg + do + case $lt_wr_arg in + --lt-*) ;; + *) set x "$@" "$lt_wr_arg"; shift;; + esac + shift + done + func_exec_program_core ${1+"$@"} +} + + # Parse options + func_parse_lt_options "$0" ${1+"$@"} + + # Find the directory that this script lives in. + thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'` + test "x$thisdir" = "x$file" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'` + while test -n "$file"; do + destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'` + + # If there was a directory component, then change thisdir. + if test "x$destdir" != "x$file"; then + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;; + *) thisdir="$thisdir/$destdir" ;; + esac + fi + + file=`$ECHO "$file" | /bin/sed 's%^.*/%%'` + file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no + if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then + # special case for '.' + if test "$thisdir" = "."; then + thisdir=`pwd` + fi + # remove .libs from thisdir + case "$thisdir" in + *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;; + .libs ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=`cd "$thisdir" && pwd` + test -n "$absdir" && thisdir="$absdir" + + program=lt-'djpeg' + progdir="$thisdir/.libs" + + if test ! -f "$progdir/$program" || + { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \ + test "X$file" != "X$progdir/$program"; }; then + + file="$$-$program" + + if test ! -d "$progdir"; then + mkdir "$progdir" + else + rm -f "$progdir/$file" + fi + + # relink executable if necessary + if test -n "$relink_command"; then + if relink_command_output=`eval $relink_command 2>&1`; then : + else + printf %s\n "$relink_command_output" >&2 + rm -f "$progdir/$file" + exit 1 + fi + fi + + mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null || + { rm -f "$progdir/$program"; + mv -f "$progdir/$file" "$progdir/$program"; } + rm -f "$progdir/$file" + fi + + if test -f "$progdir/$program"; then + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + # Run the actual program with our arguments. + func_exec_program ${1+"$@"} + fi + else + # The program doesn't exist. + $ECHO "$0: error: \`$progdir/$program' does not exist" 1>&2 + $ECHO "This script is just a wrapper for $program." 1>&2 + $ECHO "See the libtool documentation for more information." 1>&2 + exit 1 + fi +fi diff --git a/jpeg-8c/djpeg.1 b/jpeg-8c/djpeg.1 new file mode 100644 index 00000000..f3722d15 --- /dev/null +++ b/jpeg-8c/djpeg.1 @@ -0,0 +1,252 @@ +.TH DJPEG 1 "3 October 2009" +.SH NAME +djpeg \- decompress a JPEG file to an image file +.SH SYNOPSIS +.B djpeg +[ +.I options +] +[ +.I filename +] +.LP +.SH DESCRIPTION +.LP +.B djpeg +decompresses the named JPEG file, or the standard input if no file is named, +and produces an image file on the standard output. PBMPLUS (PPM/PGM), BMP, +GIF, Targa, or RLE (Utah Raster Toolkit) output format can be selected. +(RLE is supported only if the URT library is available.) +.SH OPTIONS +All switch names may be abbreviated; for example, +.B \-grayscale +may be written +.B \-gray +or +.BR \-gr . +Most of the "basic" switches can be abbreviated to as little as one letter. +Upper and lower case are equivalent (thus +.B \-BMP +is the same as +.BR \-bmp ). +British spellings are also accepted (e.g., +.BR \-greyscale ), +though for brevity these are not mentioned below. +.PP +The basic switches are: +.TP +.BI \-colors " N" +Reduce image to at most N colors. This reduces the number of colors used in +the output image, so that it can be displayed on a colormapped display or +stored in a colormapped file format. For example, if you have an 8-bit +display, you'd need to reduce to 256 or fewer colors. +.TP +.BI \-quantize " N" +Same as +.BR \-colors . +.B \-colors +is the recommended name, +.B \-quantize +is provided only for backwards compatibility. +.TP +.B \-fast +Select recommended processing options for fast, low quality output. (The +default options are chosen for highest quality output.) Currently, this is +equivalent to \fB\-dct fast \-nosmooth \-onepass \-dither ordered\fR. +.TP +.B \-grayscale +Force gray-scale output even if JPEG file is color. Useful for viewing on +monochrome displays; also, +.B djpeg +runs noticeably faster in this mode. +.TP +.BI \-scale " M/N" +Scale the output image by a factor M/N. Currently supported scale factors are +M/N with all M from 1 to 16, where N is the source DCT size, which is 8 for +baseline JPEG. If the /N part is omitted, then M specifies the DCT scaled +size to be applied on the given input. For baseline JPEG this is equivalent +to M/8 scaling, since the source DCT size for baseline JPEG is 8. +Scaling is handy if the image is larger than your screen; also, +.B djpeg +runs much faster when scaling down the output. +.TP +.B \-bmp +Select BMP output format (Windows flavor). 8-bit colormapped format is +emitted if +.B \-colors +or +.B \-grayscale +is specified, or if the JPEG file is gray-scale; otherwise, 24-bit full-color +format is emitted. +.TP +.B \-gif +Select GIF output format. Since GIF does not support more than 256 colors, +.B \-colors 256 +is assumed (unless you specify a smaller number of colors). +.TP +.B \-os2 +Select BMP output format (OS/2 1.x flavor). 8-bit colormapped format is +emitted if +.B \-colors +or +.B \-grayscale +is specified, or if the JPEG file is gray-scale; otherwise, 24-bit full-color +format is emitted. +.TP +.B \-pnm +Select PBMPLUS (PPM/PGM) output format (this is the default format). +PGM is emitted if the JPEG file is gray-scale or if +.B \-grayscale +is specified; otherwise PPM is emitted. +.TP +.B \-rle +Select RLE output format. (Requires URT library.) +.TP +.B \-targa +Select Targa output format. Gray-scale format is emitted if the JPEG file is +gray-scale or if +.B \-grayscale +is specified; otherwise, colormapped format is emitted if +.B \-colors +is specified; otherwise, 24-bit full-color format is emitted. +.PP +Switches for advanced users: +.TP +.B \-dct int +Use integer DCT method (default). +.TP +.B \-dct fast +Use fast integer DCT (less accurate). +.TP +.B \-dct float +Use floating-point DCT method. +The float method is very slightly more accurate than the int method, but is +much slower unless your machine has very fast floating-point hardware. Also +note that results of the floating-point method may vary slightly across +machines, while the integer methods should give the same results everywhere. +The fast integer method is much less accurate than the other two. +.TP +.B \-dither fs +Use Floyd-Steinberg dithering in color quantization. +.TP +.B \-dither ordered +Use ordered dithering in color quantization. +.TP +.B \-dither none +Do not use dithering in color quantization. +By default, Floyd-Steinberg dithering is applied when quantizing colors; this +is slow but usually produces the best results. Ordered dither is a compromise +between speed and quality; no dithering is fast but usually looks awful. Note +that these switches have no effect unless color quantization is being done. +Ordered dither is only available in +.B \-onepass +mode. +.TP +.BI \-map " file" +Quantize to the colors used in the specified image file. This is useful for +producing multiple files with identical color maps, or for forcing a +predefined set of colors to be used. The +.I file +must be a GIF or PPM file. This option overrides +.B \-colors +and +.BR \-onepass . +.TP +.B \-nosmooth +Don't use high-quality upsampling. +.TP +.B \-onepass +Use one-pass instead of two-pass color quantization. The one-pass method is +faster and needs less memory, but it produces a lower-quality image. +.B \-onepass +is ignored unless you also say +.B \-colors +.IR N . +Also, the one-pass method is always used for gray-scale output (the two-pass +method is no improvement then). +.TP +.BI \-maxmemory " N" +Set limit for amount of memory to use in processing large images. Value is +in thousands of bytes, or millions of bytes if "M" is attached to the +number. For example, +.B \-max 4m +selects 4000000 bytes. If more space is needed, temporary files will be used. +.TP +.BI \-outfile " name" +Send output image to the named file, not to standard output. +.TP +.B \-verbose +Enable debug printout. More +.BR \-v 's +give more output. Also, version information is printed at startup. +.TP +.B \-debug +Same as +.BR \-verbose . +.SH EXAMPLES +.LP +This example decompresses the JPEG file foo.jpg, quantizes it to +256 colors, and saves the output in 8-bit BMP format in foo.bmp: +.IP +.B djpeg \-colors 256 \-bmp +.I foo.jpg +.B > +.I foo.bmp +.SH HINTS +To get a quick preview of an image, use the +.B \-grayscale +and/or +.B \-scale +switches. +.B \-grayscale \-scale 1/8 +is the fastest case. +.PP +Several options are available that trade off image quality to gain speed. +.B \-fast +turns on the recommended settings. +.PP +.B \-dct fast +and/or +.B \-nosmooth +gain speed at a small sacrifice in quality. +When producing a color-quantized image, +.B \-onepass \-dither ordered +is fast but much lower quality than the default behavior. +.B \-dither none +may give acceptable results in two-pass mode, but is seldom tolerable in +one-pass mode. +.PP +If you are fortunate enough to have very fast floating point hardware, +\fB\-dct float\fR may be even faster than \fB\-dct fast\fR. But on most +machines \fB\-dct float\fR is slower than \fB\-dct int\fR; in this case it is +not worth using, because its theoretical accuracy advantage is too small to be +significant in practice. +.SH ENVIRONMENT +.TP +.B JPEGMEM +If this environment variable is set, its value is the default memory limit. +The value is specified as described for the +.B \-maxmemory +switch. +.B JPEGMEM +overrides the default value specified when the program was compiled, and +itself is overridden by an explicit +.BR \-maxmemory . +.SH SEE ALSO +.BR cjpeg (1), +.BR jpegtran (1), +.BR rdjpgcom (1), +.BR wrjpgcom (1) +.br +.BR ppm (5), +.BR pgm (5) +.br +Wallace, Gregory K. "The JPEG Still Picture Compression Standard", +Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44. +.SH AUTHOR +Independent JPEG Group +.SH BUGS +To avoid the Unisys LZW patent, +.B djpeg +produces uncompressed GIF files. These are larger than they should be, but +are readable by standard GIF decoders. diff --git a/jpeg-8c/djpeg.c b/jpeg-8c/djpeg.c new file mode 100644 index 00000000..bc544dc1 --- /dev/null +++ b/jpeg-8c/djpeg.c @@ -0,0 +1,617 @@ +/* + * djpeg.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * 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 command-line user interface for the JPEG decompressor. + * It should work on any system with Unix- or MS-DOS-style command lines. + * + * Two different command line styles are permitted, depending on the + * compile-time switch TWO_FILE_COMMANDLINE: + * djpeg [options] inputfile outputfile + * djpeg [options] [inputfile] + * In the second style, output is always to standard output, which you'd + * normally redirect to a file or pipe to some other program. Input is + * either from a named file or from standard input (typically redirected). + * The second style is convenient on Unix but is unhelpful on systems that + * don't support pipes. Also, you MUST use the first style if your system + * doesn't do binary I/O to stdin/stdout. + * To simplify script writing, the "-outfile" switch is provided. The syntax + * djpeg [options] -outfile outputfile inputfile + * works regardless of which command line style is used. + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ +#include "jversion.h" /* for version message */ + +#include /* to declare isprint() */ + +#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ +#ifdef __MWERKS__ +#include /* Metrowerks needs this */ +#include /* ... and this */ +#endif +#ifdef THINK_C +#include /* Think declares it here */ +#endif +#endif + + +/* Create the add-on message string table. */ + +#define JMESSAGE(code,string) string , + +static const char * const cdjpeg_message_table[] = { +#include "cderror.h" + NULL +}; + + +/* + * This list defines the known output image formats + * (not all of which need be supported by a given version). + * You can change the default output format by defining DEFAULT_FMT; + * indeed, you had better do so if you undefine PPM_SUPPORTED. + */ + +typedef enum { + FMT_BMP, /* BMP format (Windows flavor) */ + FMT_GIF, /* GIF format */ + FMT_OS2, /* BMP format (OS/2 flavor) */ + FMT_PPM, /* PPM/PGM (PBMPLUS formats) */ + FMT_RLE, /* RLE format */ + FMT_TARGA, /* Targa format */ + FMT_TIFF /* TIFF format */ +} IMAGE_FORMATS; + +#ifndef DEFAULT_FMT /* so can override from CFLAGS in Makefile */ +#define DEFAULT_FMT FMT_PPM +#endif + +static IMAGE_FORMATS requested_fmt; + + +/* + * Argument-parsing code. + * The switch parser is designed to be useful with DOS-style command line + * syntax, ie, intermixed switches and file names, where only the switches + * to the left of a given file name affect processing of that file. + * The main program in this file doesn't actually use this capability... + */ + + +static const char * progname; /* program name for error messages */ +static char * outfilename; /* for -outfile switch */ + + +LOCAL(void) +usage (void) +/* complain about bad command line */ +{ + fprintf(stderr, "usage: %s [switches] ", progname); +#ifdef TWO_FILE_COMMANDLINE + fprintf(stderr, "inputfile outputfile\n"); +#else + fprintf(stderr, "[inputfile]\n"); +#endif + + fprintf(stderr, "Switches (names may be abbreviated):\n"); + fprintf(stderr, " -colors N Reduce image to no more than N colors\n"); + fprintf(stderr, " -fast Fast, low-quality processing\n"); + fprintf(stderr, " -grayscale Force grayscale output\n"); +#ifdef IDCT_SCALING_SUPPORTED + fprintf(stderr, " -scale M/N Scale output image by fraction M/N, eg, 1/8\n"); +#endif +#ifdef BMP_SUPPORTED + fprintf(stderr, " -bmp Select BMP output format (Windows style)%s\n", + (DEFAULT_FMT == FMT_BMP ? " (default)" : "")); +#endif +#ifdef GIF_SUPPORTED + fprintf(stderr, " -gif Select GIF output format%s\n", + (DEFAULT_FMT == FMT_GIF ? " (default)" : "")); +#endif +#ifdef BMP_SUPPORTED + fprintf(stderr, " -os2 Select BMP output format (OS/2 style)%s\n", + (DEFAULT_FMT == FMT_OS2 ? " (default)" : "")); +#endif +#ifdef PPM_SUPPORTED + fprintf(stderr, " -pnm Select PBMPLUS (PPM/PGM) output format%s\n", + (DEFAULT_FMT == FMT_PPM ? " (default)" : "")); +#endif +#ifdef RLE_SUPPORTED + fprintf(stderr, " -rle Select Utah RLE output format%s\n", + (DEFAULT_FMT == FMT_RLE ? " (default)" : "")); +#endif +#ifdef TARGA_SUPPORTED + fprintf(stderr, " -targa Select Targa output format%s\n", + (DEFAULT_FMT == FMT_TARGA ? " (default)" : "")); +#endif + fprintf(stderr, "Switches for advanced users:\n"); +#ifdef DCT_ISLOW_SUPPORTED + fprintf(stderr, " -dct int Use integer DCT method%s\n", + (JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : "")); +#endif +#ifdef DCT_IFAST_SUPPORTED + fprintf(stderr, " -dct fast Use fast integer DCT (less accurate)%s\n", + (JDCT_DEFAULT == JDCT_IFAST ? " (default)" : "")); +#endif +#ifdef DCT_FLOAT_SUPPORTED + fprintf(stderr, " -dct float Use floating-point DCT method%s\n", + (JDCT_DEFAULT == JDCT_FLOAT ? " (default)" : "")); +#endif + fprintf(stderr, " -dither fs Use F-S dithering (default)\n"); + fprintf(stderr, " -dither none Don't use dithering in quantization\n"); + fprintf(stderr, " -dither ordered Use ordered dither (medium speed, quality)\n"); +#ifdef QUANT_2PASS_SUPPORTED + fprintf(stderr, " -map FILE Map to colors used in named image file\n"); +#endif + fprintf(stderr, " -nosmooth Don't use high-quality upsampling\n"); +#ifdef QUANT_1PASS_SUPPORTED + fprintf(stderr, " -onepass Use 1-pass quantization (fast, low quality)\n"); +#endif + fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n"); + fprintf(stderr, " -outfile name Specify name for output file\n"); + fprintf(stderr, " -verbose or -debug Emit debug output\n"); + exit(EXIT_FAILURE); +} + + +LOCAL(int) +parse_switches (j_decompress_ptr cinfo, int argc, char **argv, + int last_file_arg_seen, boolean for_real) +/* Parse optional switches. + * Returns argv[] index of first file-name argument (== argc if none). + * Any file names with indexes <= last_file_arg_seen are ignored; + * they have presumably been processed in a previous iteration. + * (Pass 0 for last_file_arg_seen on the first or only iteration.) + * for_real is FALSE on the first (dummy) pass; we may skip any expensive + * processing. + */ +{ + int argn; + char * arg; + + /* Set up default JPEG parameters. */ + requested_fmt = DEFAULT_FMT; /* set default output file format */ + outfilename = NULL; + cinfo->err->trace_level = 0; + + /* Scan command line options, adjust parameters */ + + for (argn = 1; argn < argc; argn++) { + arg = argv[argn]; + if (*arg != '-') { + /* Not a switch, must be a file name argument */ + if (argn <= last_file_arg_seen) { + outfilename = NULL; /* -outfile applies to just one input file */ + continue; /* ignore this name if previously processed */ + } + break; /* else done parsing switches */ + } + arg++; /* advance past switch marker character */ + + if (keymatch(arg, "bmp", 1)) { + /* BMP output format. */ + requested_fmt = FMT_BMP; + + } else if (keymatch(arg, "colors", 1) || keymatch(arg, "colours", 1) || + keymatch(arg, "quantize", 1) || keymatch(arg, "quantise", 1)) { + /* Do color quantization. */ + int val; + + if (++argn >= argc) /* advance to next argument */ + usage(); + if (sscanf(argv[argn], "%d", &val) != 1) + usage(); + cinfo->desired_number_of_colors = val; + cinfo->quantize_colors = TRUE; + + } else if (keymatch(arg, "dct", 2)) { + /* Select IDCT algorithm. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + if (keymatch(argv[argn], "int", 1)) { + cinfo->dct_method = JDCT_ISLOW; + } else if (keymatch(argv[argn], "fast", 2)) { + cinfo->dct_method = JDCT_IFAST; + } else if (keymatch(argv[argn], "float", 2)) { + cinfo->dct_method = JDCT_FLOAT; + } else + usage(); + + } else if (keymatch(arg, "dither", 2)) { + /* Select dithering algorithm. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + if (keymatch(argv[argn], "fs", 2)) { + cinfo->dither_mode = JDITHER_FS; + } else if (keymatch(argv[argn], "none", 2)) { + cinfo->dither_mode = JDITHER_NONE; + } else if (keymatch(argv[argn], "ordered", 2)) { + cinfo->dither_mode = JDITHER_ORDERED; + } else + usage(); + + } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { + /* Enable debug printouts. */ + /* On first -d, print version identification */ + static boolean printed_version = FALSE; + + if (! printed_version) { + fprintf(stderr, "Independent JPEG Group's DJPEG, version %s\n%s\n", + JVERSION, JCOPYRIGHT); + printed_version = TRUE; + } + cinfo->err->trace_level++; + + } else if (keymatch(arg, "fast", 1)) { + /* Select recommended processing options for quick-and-dirty output. */ + cinfo->two_pass_quantize = FALSE; + cinfo->dither_mode = JDITHER_ORDERED; + if (! cinfo->quantize_colors) /* don't override an earlier -colors */ + cinfo->desired_number_of_colors = 216; + cinfo->dct_method = JDCT_FASTEST; + cinfo->do_fancy_upsampling = FALSE; + + } else if (keymatch(arg, "gif", 1)) { + /* GIF output format. */ + requested_fmt = FMT_GIF; + + } else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) { + /* Force monochrome output. */ + cinfo->out_color_space = JCS_GRAYSCALE; + + } else if (keymatch(arg, "map", 3)) { + /* Quantize to a color map taken from an input file. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + if (for_real) { /* too expensive to do twice! */ +#ifdef QUANT_2PASS_SUPPORTED /* otherwise can't quantize to supplied map */ + FILE * mapfile; + + if ((mapfile = fopen(argv[argn], READ_BINARY)) == NULL) { + fprintf(stderr, "%s: can't open %s\n", progname, argv[argn]); + exit(EXIT_FAILURE); + } + read_color_map(cinfo, mapfile); + fclose(mapfile); + cinfo->quantize_colors = TRUE; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } + + } else if (keymatch(arg, "maxmemory", 3)) { + /* Maximum memory in Kb (or Mb with 'm'). */ + long lval; + char ch = 'x'; + + if (++argn >= argc) /* advance to next argument */ + usage(); + if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) + usage(); + if (ch == 'm' || ch == 'M') + lval *= 1000L; + cinfo->mem->max_memory_to_use = lval * 1000L; + + } else if (keymatch(arg, "nosmooth", 3)) { + /* Suppress fancy upsampling */ + cinfo->do_fancy_upsampling = FALSE; + + } else if (keymatch(arg, "onepass", 3)) { + /* Use fast one-pass quantization. */ + cinfo->two_pass_quantize = FALSE; + + } else if (keymatch(arg, "os2", 3)) { + /* BMP output format (OS/2 flavor). */ + requested_fmt = FMT_OS2; + + } else if (keymatch(arg, "outfile", 4)) { + /* Set output file name. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + outfilename = argv[argn]; /* save it away for later use */ + + } else if (keymatch(arg, "pnm", 1) || keymatch(arg, "ppm", 1)) { + /* PPM/PGM output format. */ + requested_fmt = FMT_PPM; + + } else if (keymatch(arg, "rle", 1)) { + /* RLE output format. */ + requested_fmt = FMT_RLE; + + } else if (keymatch(arg, "scale", 1)) { + /* Scale the output image by a fraction M/N. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + if (sscanf(argv[argn], "%d/%d", + &cinfo->scale_num, &cinfo->scale_denom) < 1) + usage(); + + } else if (keymatch(arg, "targa", 1)) { + /* Targa output format. */ + requested_fmt = FMT_TARGA; + + } else { + usage(); /* bogus switch */ + } + } + + return argn; /* return index of next arg (file name) */ +} + + +/* + * Marker processor for COM and interesting APPn markers. + * This replaces the library's built-in processor, which just skips the marker. + * We want to print out the marker as text, to the extent possible. + * Note this code relies on a non-suspending data source. + */ + +LOCAL(unsigned int) +jpeg_getc (j_decompress_ptr cinfo) +/* Read next byte */ +{ + struct jpeg_source_mgr * datasrc = cinfo->src; + + if (datasrc->bytes_in_buffer == 0) { + if (! (*datasrc->fill_input_buffer) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + } + datasrc->bytes_in_buffer--; + return GETJOCTET(*datasrc->next_input_byte++); +} + + +METHODDEF(boolean) +print_text_marker (j_decompress_ptr cinfo) +{ + boolean traceit = (cinfo->err->trace_level >= 1); + INT32 length; + unsigned int ch; + unsigned int lastch = 0; + + length = jpeg_getc(cinfo) << 8; + length += jpeg_getc(cinfo); + length -= 2; /* discount the length word itself */ + + if (traceit) { + if (cinfo->unread_marker == JPEG_COM) + fprintf(stderr, "Comment, length %ld:\n", (long) length); + else /* assume it is an APPn otherwise */ + fprintf(stderr, "APP%d, length %ld:\n", + cinfo->unread_marker - JPEG_APP0, (long) length); + } + + while (--length >= 0) { + ch = jpeg_getc(cinfo); + if (traceit) { + /* Emit the character in a readable form. + * Nonprintables are converted to \nnn form, + * while \ is converted to \\. + * Newlines in CR, CR/LF, or LF form will be printed as one newline. + */ + if (ch == '\r') { + fprintf(stderr, "\n"); + } else if (ch == '\n') { + if (lastch != '\r') + fprintf(stderr, "\n"); + } else if (ch == '\\') { + fprintf(stderr, "\\\\"); + } else if (isprint(ch)) { + putc(ch, stderr); + } else { + fprintf(stderr, "\\%03o", ch); + } + lastch = ch; + } + } + + if (traceit) + fprintf(stderr, "\n"); + + return TRUE; +} + + +/* + * The main program. + */ + +int +main (int argc, char **argv) +{ + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; +#ifdef PROGRESS_REPORT + struct cdjpeg_progress_mgr progress; +#endif + int file_index; + djpeg_dest_ptr dest_mgr = NULL; + FILE * input_file; + FILE * output_file; + JDIMENSION num_scanlines; + + /* On Mac, fetch a command line. */ +#ifdef USE_CCOMMAND + argc = ccommand(&argv); +#endif + + progname = argv[0]; + if (progname == NULL || progname[0] == 0) + progname = "djpeg"; /* in case C library doesn't provide it */ + + /* Initialize the JPEG decompression object with default error handling. */ + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + /* Add some application-specific error messages (from cderror.h) */ + jerr.addon_message_table = cdjpeg_message_table; + jerr.first_addon_message = JMSG_FIRSTADDONCODE; + jerr.last_addon_message = JMSG_LASTADDONCODE; + + /* Insert custom marker processor for COM and APP12. + * APP12 is used by some digital camera makers for textual info, + * so we provide the ability to display it as text. + * If you like, additional APPn marker types can be selected for display, + * but don't try to override APP0 or APP14 this way (see libjpeg.doc). + */ + jpeg_set_marker_processor(&cinfo, JPEG_COM, print_text_marker); + jpeg_set_marker_processor(&cinfo, JPEG_APP0+12, print_text_marker); + + /* Now safe to enable signal catcher. */ +#ifdef NEED_SIGNAL_CATCHER + enable_signal_catcher((j_common_ptr) &cinfo); +#endif + + /* Scan command line to find file names. */ + /* It is convenient to use just one switch-parsing routine, but the switch + * values read here are ignored; we will rescan the switches after opening + * the input file. + * (Exception: tracing level set here controls verbosity for COM markers + * found during jpeg_read_header...) + */ + + file_index = parse_switches(&cinfo, argc, argv, 0, FALSE); + +#ifdef TWO_FILE_COMMANDLINE + /* Must have either -outfile switch or explicit output file name */ + if (outfilename == NULL) { + if (file_index != argc-2) { + fprintf(stderr, "%s: must name one input and one output file\n", + progname); + usage(); + } + outfilename = argv[file_index+1]; + } else { + if (file_index != argc-1) { + fprintf(stderr, "%s: must name one input and one output file\n", + progname); + usage(); + } + } +#else + /* Unix style: expect zero or one file name */ + if (file_index < argc-1) { + fprintf(stderr, "%s: only one input file\n", progname); + usage(); + } +#endif /* TWO_FILE_COMMANDLINE */ + + /* Open the input file. */ + if (file_index < argc) { + if ((input_file = fopen(argv[file_index], READ_BINARY)) == NULL) { + fprintf(stderr, "%s: can't open %s\n", progname, argv[file_index]); + exit(EXIT_FAILURE); + } + } else { + /* default input file is stdin */ + input_file = read_stdin(); + } + + /* Open the output file. */ + if (outfilename != NULL) { + if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) { + fprintf(stderr, "%s: can't open %s\n", progname, outfilename); + exit(EXIT_FAILURE); + } + } else { + /* default output file is stdout */ + output_file = write_stdout(); + } + +#ifdef PROGRESS_REPORT + start_progress_monitor((j_common_ptr) &cinfo, &progress); +#endif + + /* Specify data source for decompression */ + jpeg_stdio_src(&cinfo, input_file); + + /* Read file header, set default decompression parameters */ + (void) jpeg_read_header(&cinfo, TRUE); + + /* Adjust default decompression parameters by re-parsing the options */ + file_index = parse_switches(&cinfo, argc, argv, 0, TRUE); + + /* Initialize the output module now to let it override any crucial + * option settings (for instance, GIF wants to force color quantization). + */ + switch (requested_fmt) { +#ifdef BMP_SUPPORTED + case FMT_BMP: + dest_mgr = jinit_write_bmp(&cinfo, FALSE); + break; + case FMT_OS2: + dest_mgr = jinit_write_bmp(&cinfo, TRUE); + break; +#endif +#ifdef GIF_SUPPORTED + case FMT_GIF: + dest_mgr = jinit_write_gif(&cinfo); + break; +#endif +#ifdef PPM_SUPPORTED + case FMT_PPM: + dest_mgr = jinit_write_ppm(&cinfo); + break; +#endif +#ifdef RLE_SUPPORTED + case FMT_RLE: + dest_mgr = jinit_write_rle(&cinfo); + break; +#endif +#ifdef TARGA_SUPPORTED + case FMT_TARGA: + dest_mgr = jinit_write_targa(&cinfo); + break; +#endif + default: + ERREXIT(&cinfo, JERR_UNSUPPORTED_FORMAT); + break; + } + dest_mgr->output_file = output_file; + + /* Start decompressor */ + (void) jpeg_start_decompress(&cinfo); + + /* Write output file header */ + (*dest_mgr->start_output) (&cinfo, dest_mgr); + + /* Process data */ + while (cinfo.output_scanline < cinfo.output_height) { + num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer, + dest_mgr->buffer_height); + (*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines); + } + +#ifdef PROGRESS_REPORT + /* Hack: count final pass as done in case finish_output does an extra pass. + * The library won't have updated completed_passes. + */ + progress.pub.completed_passes = progress.pub.total_passes; +#endif + + /* Finish decompression and release memory. + * I must do it in this order because output module has allocated memory + * of lifespan JPOOL_IMAGE; it needs to finish before releasing memory. + */ + (*dest_mgr->finish_output) (&cinfo, dest_mgr); + (void) jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); + + /* Close files, if we opened them */ + if (input_file != stdin) + fclose(input_file); + if (output_file != stdout) + fclose(output_file); + +#ifdef PROGRESS_REPORT + end_progress_monitor((j_common_ptr) &cinfo); +#endif + + /* All done. */ + exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS); + return 0; /* suppress no-return-value warnings */ +} diff --git a/jpeg-8c/example.c b/jpeg-8c/example.c new file mode 100644 index 00000000..1d6f6cc3 --- /dev/null +++ b/jpeg-8c/example.c @@ -0,0 +1,433 @@ +/* + * example.c + * + * This file illustrates how to use the IJG code as a subroutine library + * to read or write JPEG image files. You should look at this code in + * conjunction with the documentation file libjpeg.txt. + * + * This code will not do anything useful as-is, but it may be helpful as a + * skeleton for constructing routines that call the JPEG library. + * + * We present these routines in the same coding style used in the JPEG code + * (ANSI function definitions, etc); but you are of course free to code your + * routines in a different style if you prefer. + */ + +#include + +/* + * Include file for users of JPEG library. + * You will need to have included system headers that define at least + * the typedefs FILE and size_t before you can include jpeglib.h. + * (stdio.h is sufficient on ANSI-conforming systems.) + * You may also wish to include "jerror.h". + */ + +#include "jpeglib.h" + +/* + * is used for the optional error recovery mechanism shown in + * the second part of the example. + */ + +#include + + + +/******************** JPEG COMPRESSION SAMPLE INTERFACE *******************/ + +/* This half of the example shows how to feed data into the JPEG compressor. + * We present a minimal version that does not worry about refinements such + * as error recovery (the JPEG code will just exit() if it gets an error). + */ + + +/* + * IMAGE DATA FORMATS: + * + * The standard input image format is a rectangular array of pixels, with + * each pixel having the same number of "component" values (color channels). + * Each pixel row is an array of JSAMPLEs (which typically are unsigned chars). + * If you are working with color data, then the color values for each pixel + * must be adjacent in the row; for example, R,G,B,R,G,B,R,G,B,... for 24-bit + * RGB color. + * + * For this example, we'll assume that this data structure matches the way + * our application has stored the image in memory, so we can just pass a + * pointer to our image buffer. In particular, let's say that the image is + * RGB color and is described by: + */ + +extern JSAMPLE * image_buffer; /* Points to large array of R,G,B-order data */ +extern int image_height; /* Number of rows in image */ +extern int image_width; /* Number of columns in image */ + + +/* + * Sample routine for JPEG compression. We assume that the target file name + * and a compression quality factor are passed in. + */ + +GLOBAL(void) +write_JPEG_file (char * filename, int quality) +{ + /* This struct contains the JPEG compression parameters and pointers to + * working space (which is allocated as needed by the JPEG library). + * It is possible to have several such structures, representing multiple + * compression/decompression processes, in existence at once. We refer + * to any one struct (and its associated working data) as a "JPEG object". + */ + struct jpeg_compress_struct cinfo; + /* This struct represents a JPEG error handler. It is declared separately + * because applications often want to supply a specialized error handler + * (see the second half of this file for an example). But here we just + * take the easy way out and use the standard error handler, which will + * print a message on stderr and call exit() if compression fails. + * Note that this struct must live as long as the main JPEG parameter + * struct, to avoid dangling-pointer problems. + */ + struct jpeg_error_mgr jerr; + /* More stuff */ + FILE * outfile; /* target file */ + JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ + int row_stride; /* physical row width in image buffer */ + + /* Step 1: allocate and initialize JPEG compression object */ + + /* We have to set up the error handler first, in case the initialization + * step fails. (Unlikely, but it could happen if you are out of memory.) + * This routine fills in the contents of struct jerr, and returns jerr's + * address which we place into the link field in cinfo. + */ + cinfo.err = jpeg_std_error(&jerr); + /* Now we can initialize the JPEG compression object. */ + jpeg_create_compress(&cinfo); + + /* Step 2: specify data destination (eg, a file) */ + /* Note: steps 2 and 3 can be done in either order. */ + + /* Here we use the library-supplied code to send compressed data to a + * stdio stream. You can also write your own code to do something else. + * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that + * requires it in order to write binary files. + */ + if ((outfile = fopen(filename, "wb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + exit(1); + } + jpeg_stdio_dest(&cinfo, outfile); + + /* Step 3: set parameters for compression */ + + /* First we supply a description of the input image. + * Four fields of the cinfo struct must be filled in: + */ + cinfo.image_width = image_width; /* image width and height, in pixels */ + cinfo.image_height = image_height; + cinfo.input_components = 3; /* # of color components per pixel */ + cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ + /* Now use the library's routine to set default compression parameters. + * (You must set at least cinfo.in_color_space before calling this, + * since the defaults depend on the source color space.) + */ + jpeg_set_defaults(&cinfo); + /* Now you can set any non-default parameters you wish to. + * Here we just illustrate the use of quality (quantization table) scaling: + */ + jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */); + + /* Step 4: Start compressor */ + + /* TRUE ensures that we will write a complete interchange-JPEG file. + * Pass TRUE unless you are very sure of what you're doing. + */ + jpeg_start_compress(&cinfo, TRUE); + + /* Step 5: while (scan lines remain to be written) */ + /* jpeg_write_scanlines(...); */ + + /* Here we use the library's state variable cinfo.next_scanline as the + * loop counter, so that we don't have to keep track ourselves. + * To keep things simple, we pass one scanline per call; you can pass + * more if you wish, though. + */ + row_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */ + + while (cinfo.next_scanline < cinfo.image_height) { + /* jpeg_write_scanlines expects an array of pointers to scanlines. + * Here the array is only one element long, but you could pass + * more than one scanline at a time if that's more convenient. + */ + row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; + (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); + } + + /* Step 6: Finish compression */ + + jpeg_finish_compress(&cinfo); + /* After finish_compress, we can close the output file. */ + fclose(outfile); + + /* Step 7: release JPEG compression object */ + + /* This is an important step since it will release a good deal of memory. */ + jpeg_destroy_compress(&cinfo); + + /* And we're done! */ +} + + +/* + * SOME FINE POINTS: + * + * In the above loop, we ignored the return value of jpeg_write_scanlines, + * which is the number of scanlines actually written. We could get away + * with this because we were only relying on the value of cinfo.next_scanline, + * which will be incremented correctly. If you maintain additional loop + * variables then you should be careful to increment them properly. + * Actually, for output to a stdio stream you needn't worry, because + * then jpeg_write_scanlines will write all the lines passed (or else exit + * with a fatal error). Partial writes can only occur if you use a data + * destination module that can demand suspension of the compressor. + * (If you don't know what that's for, you don't need it.) + * + * If the compressor requires full-image buffers (for entropy-coding + * optimization or a multi-scan JPEG file), it will create temporary + * files for anything that doesn't fit within the maximum-memory setting. + * (Note that temp files are NOT needed if you use the default parameters.) + * On some systems you may need to set up a signal handler to ensure that + * temporary files are deleted if the program is interrupted. See libjpeg.txt. + * + * Scanlines MUST be supplied in top-to-bottom order if you want your JPEG + * files to be compatible with everyone else's. If you cannot readily read + * your data in that order, you'll need an intermediate array to hold the + * image. See rdtarga.c or rdbmp.c for examples of handling bottom-to-top + * source data using the JPEG code's internal virtual-array mechanisms. + */ + + + +/******************** JPEG DECOMPRESSION SAMPLE INTERFACE *******************/ + +/* This half of the example shows how to read data from the JPEG decompressor. + * It's a bit more refined than the above, in that we show: + * (a) how to modify the JPEG library's standard error-reporting behavior; + * (b) how to allocate workspace using the library's memory manager. + * + * Just to make this example a little different from the first one, we'll + * assume that we do not intend to put the whole image into an in-memory + * buffer, but to send it line-by-line someplace else. We need a one- + * scanline-high JSAMPLE array as a work buffer, and we will let the JPEG + * memory manager allocate it for us. This approach is actually quite useful + * because we don't need to remember to deallocate the buffer separately: it + * will go away automatically when the JPEG object is cleaned up. + */ + + +/* + * ERROR HANDLING: + * + * The JPEG library's standard error handler (jerror.c) is divided into + * several "methods" which you can override individually. This lets you + * adjust the behavior without duplicating a lot of code, which you might + * have to update with each future release. + * + * Our example here shows how to override the "error_exit" method so that + * control is returned to the library's caller when a fatal error occurs, + * rather than calling exit() as the standard error_exit method does. + * + * We use C's setjmp/longjmp facility to return control. This means that the + * routine which calls the JPEG library must first execute a setjmp() call to + * establish the return point. We want the replacement error_exit to do a + * longjmp(). But we need to make the setjmp buffer accessible to the + * error_exit routine. To do this, we make a private extension of the + * standard JPEG error handler object. (If we were using C++, we'd say we + * were making a subclass of the regular error handler.) + * + * Here's the extended error handler struct: + */ + +struct my_error_mgr { + struct jpeg_error_mgr pub; /* "public" fields */ + + jmp_buf setjmp_buffer; /* for return to caller */ +}; + +typedef struct my_error_mgr * my_error_ptr; + +/* + * Here's the routine that will replace the standard error_exit method: + */ + +METHODDEF(void) +my_error_exit (j_common_ptr cinfo) +{ + /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */ + my_error_ptr myerr = (my_error_ptr) cinfo->err; + + /* Always display the message. */ + /* We could postpone this until after returning, if we chose. */ + (*cinfo->err->output_message) (cinfo); + + /* Return control to the setjmp point */ + longjmp(myerr->setjmp_buffer, 1); +} + + +/* + * Sample routine for JPEG decompression. We assume that the source file name + * is passed in. We want to return 1 on success, 0 on error. + */ + + +GLOBAL(int) +read_JPEG_file (char * filename) +{ + /* This struct contains the JPEG decompression parameters and pointers to + * working space (which is allocated as needed by the JPEG library). + */ + struct jpeg_decompress_struct cinfo; + /* We use our private extension JPEG error handler. + * Note that this struct must live as long as the main JPEG parameter + * struct, to avoid dangling-pointer problems. + */ + struct my_error_mgr jerr; + /* More stuff */ + FILE * infile; /* source file */ + JSAMPARRAY buffer; /* Output row buffer */ + int row_stride; /* physical row width in output buffer */ + + /* In this example we want to open the input file before doing anything else, + * so that the setjmp() error recovery below can assume the file is open. + * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that + * requires it in order to read binary files. + */ + + if ((infile = fopen(filename, "rb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + return 0; + } + + /* Step 1: allocate and initialize JPEG decompression object */ + + /* We set up the normal JPEG error routines, then override error_exit. */ + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = my_error_exit; + /* Establish the setjmp return context for my_error_exit to use. */ + if (setjmp(jerr.setjmp_buffer)) { + /* If we get here, the JPEG code has signaled an error. + * We need to clean up the JPEG object, close the input file, and return. + */ + jpeg_destroy_decompress(&cinfo); + fclose(infile); + return 0; + } + /* Now we can initialize the JPEG decompression object. */ + jpeg_create_decompress(&cinfo); + + /* Step 2: specify data source (eg, a file) */ + + jpeg_stdio_src(&cinfo, infile); + + /* Step 3: read file parameters with jpeg_read_header() */ + + (void) jpeg_read_header(&cinfo, TRUE); + /* We can ignore the return value from jpeg_read_header since + * (a) suspension is not possible with the stdio data source, and + * (b) we passed TRUE to reject a tables-only JPEG file as an error. + * See libjpeg.txt for more info. + */ + + /* Step 4: set parameters for decompression */ + + /* In this example, we don't need to change any of the defaults set by + * jpeg_read_header(), so we do nothing here. + */ + + /* Step 5: Start decompressor */ + + (void) jpeg_start_decompress(&cinfo); + /* We can ignore the return value since suspension is not possible + * with the stdio data source. + */ + + /* We may need to do some setup of our own at this point before reading + * the data. After jpeg_start_decompress() we have the correct scaled + * output image dimensions available, as well as the output colormap + * if we asked for color quantization. + * In this example, we need to make an output work buffer of the right size. + */ + /* JSAMPLEs per row in output buffer */ + row_stride = cinfo.output_width * cinfo.output_components; + /* Make a one-row-high sample array that will go away when done with image */ + buffer = (*cinfo.mem->alloc_sarray) + ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); + + /* Step 6: while (scan lines remain to be read) */ + /* jpeg_read_scanlines(...); */ + + /* Here we use the library's state variable cinfo.output_scanline as the + * loop counter, so that we don't have to keep track ourselves. + */ + while (cinfo.output_scanline < cinfo.output_height) { + /* jpeg_read_scanlines expects an array of pointers to scanlines. + * Here the array is only one element long, but you could ask for + * more than one scanline at a time if that's more convenient. + */ + (void) jpeg_read_scanlines(&cinfo, buffer, 1); + /* Assume put_scanline_someplace wants a pointer and sample count. */ + put_scanline_someplace(buffer[0], row_stride); + } + + /* Step 7: Finish decompression */ + + (void) jpeg_finish_decompress(&cinfo); + /* We can ignore the return value since suspension is not possible + * with the stdio data source. + */ + + /* Step 8: Release JPEG decompression object */ + + /* This is an important step since it will release a good deal of memory. */ + jpeg_destroy_decompress(&cinfo); + + /* After finish_decompress, we can close the input file. + * Here we postpone it until after no more JPEG errors are possible, + * so as to simplify the setjmp error logic above. (Actually, I don't + * think that jpeg_destroy can do an error exit, but why assume anything...) + */ + fclose(infile); + + /* At this point you may want to check to see whether any corrupt-data + * warnings occurred (test whether jerr.pub.num_warnings is nonzero). + */ + + /* And we're done! */ + return 1; +} + + +/* + * SOME FINE POINTS: + * + * In the above code, we ignored the return value of jpeg_read_scanlines, + * which is the number of scanlines actually read. We could get away with + * this because we asked for only one line at a time and we weren't using + * a suspending data source. See libjpeg.txt for more info. + * + * We cheated a bit by calling alloc_sarray() after jpeg_start_decompress(); + * we should have done it beforehand to ensure that the space would be + * counted against the JPEG max_memory setting. In some systems the above + * code would risk an out-of-memory error. However, in general we don't + * know the output image dimensions before jpeg_start_decompress(), unless we + * call jpeg_calc_output_dimensions(). See libjpeg.txt for more about this. + * + * Scanlines are returned in the same order as they appear in the JPEG file, + * which is standardly top-to-bottom. If you must emit data bottom-to-top, + * you can use one of the virtual arrays provided by the JPEG memory manager + * to invert the data. See wrbmp.c for an example. + * + * As with compression, some operating modes may require temporary files. + * On some systems you may need to set up a signal handler to ensure that + * temporary files are deleted if the program is interrupted. See libjpeg.txt. + */ diff --git a/jpeg-8c/filelist.txt b/jpeg-8c/filelist.txt new file mode 100644 index 00000000..7e053869 --- /dev/null +++ b/jpeg-8c/filelist.txt @@ -0,0 +1,215 @@ +IJG JPEG LIBRARY: FILE LIST + +Copyright (C) 1994-2009, Thomas G. Lane, Guido Vollbeding. +This file is part of the Independent JPEG Group's software. +For conditions of distribution and use, see the accompanying README file. + + +Here is a road map to the files in the IJG JPEG distribution. The +distribution includes the JPEG library proper, plus two application +programs ("cjpeg" and "djpeg") which use the library to convert JPEG +files to and from some other popular image formats. A third application +"jpegtran" uses the library to do lossless conversion between different +variants of JPEG. There are also two stand-alone applications, +"rdjpgcom" and "wrjpgcom". + + +THE JPEG LIBRARY +================ + +Include files: + +jpeglib.h JPEG library's exported data and function declarations. +jconfig.h Configuration declarations. Note: this file is not present + in the distribution; it is generated during installation. +jmorecfg.h Additional configuration declarations; need not be changed + for a standard installation. +jerror.h Declares JPEG library's error and trace message codes. +jinclude.h Central include file used by all IJG .c files to reference + system include files. +jpegint.h JPEG library's internal data structures. +jdct.h Private declarations for forward & reverse DCT subsystems. +jmemsys.h Private declarations for memory management subsystem. +jversion.h Version information. + +Applications using the library should include jpeglib.h (which in turn +includes jconfig.h and jmorecfg.h). Optionally, jerror.h may be included +if the application needs to reference individual JPEG error codes. The +other include files are intended for internal use and would not normally +be included by an application program. (cjpeg/djpeg/etc do use jinclude.h, +since its function is to improve portability of the whole IJG distribution. +Most other applications will directly include the system include files they +want, and hence won't need jinclude.h.) + + +C source code files: + +These files contain most of the functions intended to be called directly by +an application program: + +jcapimin.c Application program interface: core routines for compression. +jcapistd.c Application program interface: standard compression. +jdapimin.c Application program interface: core routines for decompression. +jdapistd.c Application program interface: standard decompression. +jcomapi.c Application program interface routines common to compression + and decompression. +jcparam.c Compression parameter setting helper routines. +jctrans.c API and library routines for transcoding compression. +jdtrans.c API and library routines for transcoding decompression. + +Compression side of the library: + +jcinit.c Initialization: determines which other modules to use. +jcmaster.c Master control: setup and inter-pass sequencing logic. +jcmainct.c Main buffer controller (preprocessor => JPEG compressor). +jcprepct.c Preprocessor buffer controller. +jccoefct.c Buffer controller for DCT coefficient buffer. +jccolor.c Color space conversion. +jcsample.c Downsampling. +jcdctmgr.c DCT manager (DCT implementation selection & control). +jfdctint.c Forward DCT using slow-but-accurate integer method. +jfdctfst.c Forward DCT using faster, less accurate integer method. +jfdctflt.c Forward DCT using floating-point arithmetic. +jchuff.c Huffman entropy coding. +jcarith.c Arithmetic entropy coding. +jcmarker.c JPEG marker writing. +jdatadst.c Data destination managers for memory and stdio output. + +Decompression side of the library: + +jdmaster.c Master control: determines which other modules to use. +jdinput.c Input controller: controls input processing modules. +jdmainct.c Main buffer controller (JPEG decompressor => postprocessor). +jdcoefct.c Buffer controller for DCT coefficient buffer. +jdpostct.c Postprocessor buffer controller. +jdmarker.c JPEG marker reading. +jdhuff.c Huffman entropy decoding. +jdarith.c Arithmetic entropy decoding. +jddctmgr.c IDCT manager (IDCT implementation selection & control). +jidctint.c Inverse DCT using slow-but-accurate integer method. +jidctfst.c Inverse DCT using faster, less accurate integer method. +jidctflt.c Inverse DCT using floating-point arithmetic. +jdsample.c Upsampling. +jdcolor.c Color space conversion. +jdmerge.c Merged upsampling/color conversion (faster, lower quality). +jquant1.c One-pass color quantization using a fixed-spacing colormap. +jquant2.c Two-pass color quantization using a custom-generated colormap. + Also handles one-pass quantization to an externally given map. +jdatasrc.c Data source managers for memory and stdio input. + +Support files for both compression and decompression: + +jaricom.c Tables for common use in arithmetic entropy encoding and + decoding routines. +jerror.c Standard error handling routines (application replaceable). +jmemmgr.c System-independent (more or less) memory management code. +jutils.c Miscellaneous utility routines. + +jmemmgr.c relies on a system-dependent memory management module. The IJG +distribution includes the following implementations of the system-dependent +module: + +jmemnobs.c "No backing store": assumes adequate virtual memory exists. +jmemansi.c Makes temporary files with ANSI-standard routine tmpfile(). +jmemname.c Makes temporary files with program-generated file names. +jmemdos.c Custom implementation for MS-DOS (16-bit environment only): + can use extended and expanded memory as well as temp files. +jmemmac.c Custom implementation for Apple Macintosh. + +Exactly one of the system-dependent modules should be configured into an +installed JPEG library (see install.txt for hints about which one to use). +On unusual systems you may find it worthwhile to make a special +system-dependent memory manager. + + +Non-C source code files: + +jmemdosa.asm 80x86 assembly code support for jmemdos.c; used only in + MS-DOS-specific configurations of the JPEG library. + + +CJPEG/DJPEG/JPEGTRAN +==================== + +Include files: + +cdjpeg.h Declarations shared by cjpeg/djpeg/jpegtran modules. +cderror.h Additional error and trace message codes for cjpeg et al. +transupp.h Declarations for jpegtran support routines in transupp.c. + +C source code files: + +cjpeg.c Main program for cjpeg. +djpeg.c Main program for djpeg. +jpegtran.c Main program for jpegtran. +cdjpeg.c Utility routines used by all three programs. +rdcolmap.c Code to read a colormap file for djpeg's "-map" switch. +rdswitch.c Code to process some of cjpeg's more complex switches. + Also used by jpegtran. +transupp.c Support code for jpegtran: lossless image manipulations. + +Image file reader modules for cjpeg: + +rdbmp.c BMP file input. +rdgif.c GIF file input (now just a stub). +rdppm.c PPM/PGM file input. +rdrle.c Utah RLE file input. +rdtarga.c Targa file input. + +Image file writer modules for djpeg: + +wrbmp.c BMP file output. +wrgif.c GIF file output (a mere shadow of its former self). +wrppm.c PPM/PGM file output. +wrrle.c Utah RLE file output. +wrtarga.c Targa file output. + + +RDJPGCOM/WRJPGCOM +================= + +C source code files: + +rdjpgcom.c Stand-alone rdjpgcom application. +wrjpgcom.c Stand-alone wrjpgcom application. + +These programs do not depend on the IJG library. They do use +jconfig.h and jinclude.h, only to improve portability. + + +ADDITIONAL FILES +================ + +Documentation (see README for a guide to the documentation files): + +README Master documentation file. +*.txt Other documentation files. +*.1 Documentation in Unix man page format. +change.log Version-to-version change highlights. +example.c Sample code for calling JPEG library. + +Configuration/installation files and programs (see install.txt for more info): + +configure Unix shell script to perform automatic configuration. +configure.ac Source file for use with Autoconf to generate configure. +ltmain.sh Support scripts for configure (from GNU libtool). +config.guess +config.sub +depcomp +missing +install-sh Install shell script for those Unix systems lacking one. +Makefile.in Makefile input for configure. +Makefile.am Source file for use with Automake to generate Makefile.in. +ckconfig.c Program to generate jconfig.h on non-Unix systems. +jconfig.txt Template for making jconfig.h by hand. +mak*.* Sample makefiles for particular systems. +jconfig.* Sample jconfig.h for particular systems. +libjpeg.map Script to generate shared library with versioned symbols. +aclocal.m4 M4 macro definitions for use with Autoconf. +ansi2knr.c De-ANSIfier for pre-ANSI C compilers (courtesy of + L. Peter Deutsch and Aladdin Enterprises). + +Test files (see install.txt for test procedure): + +test*.* Source and comparison files for confidence test. + These are binary image files, NOT text files. diff --git a/jpeg-8c/install-sh b/jpeg-8c/install-sh new file mode 100755 index 00000000..6781b987 --- /dev/null +++ b/jpeg-8c/install-sh @@ -0,0 +1,520 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2009-04-28.21; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + -*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/jpeg-8c/install.txt b/jpeg-8c/install.txt new file mode 100644 index 00000000..2ee86adf --- /dev/null +++ b/jpeg-8c/install.txt @@ -0,0 +1,1096 @@ +INSTALLATION INSTRUCTIONS for the Independent JPEG Group's JPEG software + +Copyright (C) 1991-2010, Thomas G. Lane, Guido Vollbeding. +This file is part of the Independent JPEG Group's software. +For conditions of distribution and use, see the accompanying README file. + + +This file explains how to configure and install the IJG software. We have +tried to make this software extremely portable and flexible, so that it can be +adapted to almost any environment. The downside of this decision is that the +installation process is complicated. We have provided shortcuts to simplify +the task on common systems. But in any case, you will need at least a little +familiarity with C programming and program build procedures for your system. + +If you are only using this software as part of a larger program, the larger +program's installation procedure may take care of configuring the IJG code. +For example, Ghostscript's installation script will configure the IJG code. +You don't need to read this file if you just want to compile Ghostscript. + +If you are on a Unix machine, you may not need to read this file at all. +Try doing + ./configure + make + make test +If that doesn't complain, do + make install +(better do "make -n install" first to see if the makefile will put the files +where you want them). Read further if you run into snags or want to customize +the code for your system. + + +TABLE OF CONTENTS +----------------- + +Before you start +Configuring the software: + using the automatic "configure" script + using one of the supplied jconfig and makefile files + by hand +Building the software +Testing the software +Installing the software +Optional stuff +Optimization +Hints for specific systems + + +BEFORE YOU START +================ + +Before installing the software you must unpack the distributed source code. +Since you are reading this file, you have probably already succeeded in this +task. However, there is a potential for error if you needed to convert the +files to the local standard text file format (for example, if you are on +MS-DOS you may have converted LF end-of-line to CR/LF). You must apply +such conversion to all the files EXCEPT those whose names begin with "test". +The test files contain binary data; if you change them in any way then the +self-test will give bad results. + +Please check the last section of this file to see if there are hints for the +specific machine or compiler you are using. + + +CONFIGURING THE SOFTWARE +======================== + +To configure the IJG code for your system, you need to create two files: + * jconfig.h: contains values for system-dependent #define symbols. + * Makefile: controls the compilation process. +(On a non-Unix machine, you may create "project files" or some other +substitute for a Makefile. jconfig.h is needed in any environment.) + +We provide three different ways to generate these files: + * On a Unix system, you can just run the "configure" script. + * We provide sample jconfig files and makefiles for popular machines; + if your machine matches one of the samples, just copy the right sample + files to jconfig.h and Makefile. + * If all else fails, read the instructions below and make your own files. + + +Configuring the software using the automatic "configure" script +--------------------------------------------------------------- + +If you are on a Unix machine, you can just type + ./configure +and let the configure script construct appropriate configuration files. +If you're using "csh" on an old version of System V, you might need to type + sh configure +instead to prevent csh from trying to execute configure itself. +Expect configure to run for a few minutes, particularly on slower machines; +it works by compiling a series of test programs. + +Configure was created with GNU Autoconf and it follows the usual conventions +for GNU configure scripts. It makes a few assumptions that you may want to +override. You can do this by providing optional switches to configure: + +* Configure will build both static and shared libraries, if possible. +If you want to build libjpeg only as a static library, say + ./configure --disable-shared +If you want to build libjpeg only as a shared library, say + ./configure --disable-static +Configure uses GNU libtool to take care of system-dependent shared library +building methods. + +* Configure will use gcc (GNU C compiler) if it's available, otherwise cc. +To force a particular compiler to be selected, use the CC option, for example + ./configure CC='cc' +The same method can be used to include any unusual compiler switches. +For example, on HP-UX you probably want to say + ./configure CC='cc -Aa' +to get HP's compiler to run in ANSI mode. + +* The default CFLAGS setting is "-g" for non-gcc compilers, "-g -O2" for gcc. +You can override this by saying, for example, + ./configure CFLAGS='-O2' +if you want to compile without debugging support. + +* Configure will set up the makefile so that "make install" will install files +into /usr/local/bin, /usr/local/man, etc. You can specify an installation +prefix other than "/usr/local" by giving configure the option "--prefix=PATH". + +* If you don't have a lot of swap space, you may need to enable the IJG +software's internal virtual memory mechanism. To do this, give the option +"--enable-maxmem=N" where N is the default maxmemory limit in megabytes. +This is discussed in more detail under "Selecting a memory manager", below. +You probably don't need to worry about this on reasonably-sized Unix machines, +unless you plan to process very large images. + +Configure has some other features that are useful if you are cross-compiling +or working in a network of multiple machine types; but if you need those +features, you probably already know how to use them. + + +Configuring the software using one of the supplied jconfig and makefile files +----------------------------------------------------------------------------- + +If you have one of these systems, you can just use the provided configuration +files: + +Makefile jconfig file System and/or compiler + +makefile.manx jconfig.manx Amiga, Manx Aztec C +makefile.sas jconfig.sas Amiga, SAS C +makeproj.mac jconfig.mac Apple Macintosh, Metrowerks CodeWarrior +mak*jpeg.st jconfig.st Atari ST/STE/TT, Pure C or Turbo C +makefile.bcc jconfig.bcc MS-DOS or OS/2, Borland C +makefile.dj jconfig.dj MS-DOS, DJGPP (Delorie's port of GNU C) +makefile.mc6 jconfig.mc6 MS-DOS, Microsoft C (16-bit only) +makefile.wat jconfig.wat MS-DOS, OS/2, or Windows NT, Watcom C +makefile.vc jconfig.vc Windows NT/95, MS Visual C++ +make*.vc6 jconfig.vc Windows NT/95, MS Visual C++ 6 +make*.v10 jconfig.vc Windows NT/95, MS Visual C++ 2010 (v10) +makefile.mms jconfig.vms Digital VMS, with MMS software +makefile.vms jconfig.vms Digital VMS, without MMS software + +Copy the proper jconfig file to jconfig.h and the makefile to Makefile (or +whatever your system uses as the standard makefile name). For more info see +the appropriate system-specific hints section near the end of this file. + + +Configuring the software by hand +-------------------------------- + +First, generate a jconfig.h file. If you are moderately familiar with C, +the comments in jconfig.txt should be enough information to do this; just +copy jconfig.txt to jconfig.h and edit it appropriately. Otherwise, you may +prefer to use the ckconfig.c program. You will need to compile and execute +ckconfig.c by hand --- we hope you know at least enough to do that. +ckconfig.c may not compile the first try (in fact, the whole idea is for it +to fail if anything is going to). If you get compile errors, fix them by +editing ckconfig.c according to the directions given in ckconfig.c. Once +you get it to run, it will write a suitable jconfig.h file, and will also +print out some advice about which makefile to use. + +You may also want to look at the canned jconfig files, if there is one for a +system similar to yours. + +Second, select a makefile and copy it to Makefile (or whatever your system +uses as the standard makefile name). The most generic makefiles we provide +are + makefile.ansi: if your C compiler supports function prototypes + makefile.unix: if not. +(You have function prototypes if ckconfig.c put "#define HAVE_PROTOTYPES" +in jconfig.h.) You may want to start from one of the other makefiles if +there is one for a system similar to yours. + +Look over the selected Makefile and adjust options as needed. In particular +you may want to change the CC and CFLAGS definitions. For instance, if you +are using GCC, set CC=gcc. If you had to use any compiler switches to get +ckconfig.c to work, make sure the same switches are in CFLAGS. + +If you are on a system that doesn't use makefiles, you'll need to set up +project files (or whatever you do use) to compile all the source files and +link them into executable files cjpeg, djpeg, jpegtran, rdjpgcom, and wrjpgcom. +See the file lists in any of the makefiles to find out which files go into +each program. Note that the provided makefiles all make a "library" file +libjpeg first, but you don't have to do that if you don't want to; the file +lists identify which source files are actually needed for compression, +decompression, or both. As a last resort, you can make a batch script that +just compiles everything and links it all together; makefile.vms is an example +of this (it's for VMS systems that have no make-like utility). + +Here are comments about some specific configuration decisions you'll +need to make: + +Command line style +------------------ + +These programs can use a Unix-like command line style which supports +redirection and piping, like this: + cjpeg inputfile >outputfile + cjpeg outputfile + source program | cjpeg >outputfile +The simpler "two file" command line style is just + cjpeg inputfile outputfile +You may prefer the two-file style, particularly if you don't have pipes. + +You MUST use two-file style on any system that doesn't cope well with binary +data fed through stdin/stdout; this is true for some MS-DOS compilers, for +example. If you're not on a Unix system, it's safest to assume you need +two-file style. (But if your compiler provides either the Posix-standard +fdopen() library routine or a Microsoft-compatible setmode() routine, you +can safely use the Unix command line style, by defining USE_FDOPEN or +USE_SETMODE respectively.) + +To use the two-file style, make jconfig.h say "#define TWO_FILE_COMMANDLINE". + +Selecting a memory manager +-------------------------- + +The IJG code is capable of working on images that are too big to fit in main +memory; data is swapped out to temporary files as necessary. However, the +code to do this is rather system-dependent. We provide five different +memory managers: + +* jmemansi.c This version uses the ANSI-standard library routine tmpfile(), + which not all non-ANSI systems have. On some systems + tmpfile() may put the temporary file in a non-optimal + location; if you don't like what it does, use jmemname.c. + +* jmemname.c This version creates named temporary files. For anything + except a Unix machine, you'll need to configure the + select_file_name() routine appropriately; see the comments + near the head of jmemname.c. If you use this version, define + NEED_SIGNAL_CATCHER in jconfig.h to make sure the temp files + are removed if the program is aborted. + +* jmemnobs.c (That stands for No Backing Store :-).) This will compile on + almost any system, but it assumes you have enough main memory + or virtual memory to hold the biggest images you work with. + +* jmemdos.c This should be used with most 16-bit MS-DOS compilers. + See the system-specific notes about MS-DOS for more info. + IMPORTANT: if you use this, define USE_MSDOS_MEMMGR in + jconfig.h, and include the assembly file jmemdosa.asm in the + programs. The supplied makefiles and jconfig files for + 16-bit MS-DOS compilers already do both. + +* jmemmac.c Custom version for Apple Macintosh; see the system-specific + notes for Macintosh for more info. + +To use a particular memory manager, change the SYSDEPMEM variable in your +makefile to equal the corresponding object file name (for example, jmemansi.o +or jmemansi.obj for jmemansi.c). + +If you have plenty of (real or virtual) main memory, just use jmemnobs.c. +"Plenty" means about ten bytes for every pixel in the largest images +you plan to process, so a lot of systems don't meet this criterion. +If yours doesn't, try jmemansi.c first. If that doesn't compile, you'll have +to use jmemname.c; be sure to adjust select_file_name() for local conditions. +You may also need to change unlink() to remove() in close_backing_store(). + +Except with jmemnobs.c or jmemmac.c, you need to adjust the DEFAULT_MAX_MEM +setting to a reasonable value for your system (either by adding a #define for +DEFAULT_MAX_MEM to jconfig.h, or by adding a -D switch to the Makefile). +This value limits the amount of data space the program will attempt to +allocate. Code and static data space isn't counted, so the actual memory +needs for cjpeg or djpeg are typically 100 to 150Kb more than the max-memory +setting. Larger max-memory settings reduce the amount of I/O needed to +process a large image, but too large a value can result in "insufficient +memory" failures. On most Unix machines (and other systems with virtual +memory), just set DEFAULT_MAX_MEM to several million and forget it. At the +other end of the spectrum, for MS-DOS machines you probably can't go much +above 300K to 400K. (On MS-DOS the value refers to conventional memory only. +Extended/expanded memory is handled separately by jmemdos.c.) + + +BUILDING THE SOFTWARE +===================== + +Now you should be able to compile the software. Just say "make" (or +whatever's necessary to start the compilation). Have a cup of coffee. + +Here are some things that could go wrong: + +If your compiler complains about undefined structures, you should be able to +shut it up by putting "#define INCOMPLETE_TYPES_BROKEN" in jconfig.h. + +If you have trouble with missing system include files or inclusion of the +wrong ones, read jinclude.h. This shouldn't happen if you used configure +or ckconfig.c to set up jconfig.h. + +There are a fair number of routines that do not use all of their parameters; +some compilers will issue warnings about this, which you can ignore. There +are also a few configuration checks that may give "unreachable code" warnings. +Any other warning deserves investigation. + +If you don't have a getenv() library routine, define NO_GETENV. + +Also see the system-specific hints, below. + + +TESTING THE SOFTWARE +==================== + +As a quick test of functionality we've included a small sample image in +several forms: + testorig.jpg Starting point for the djpeg tests. + testimg.ppm The output of djpeg testorig.jpg + testimg.bmp The output of djpeg -bmp -colors 256 testorig.jpg + testimg.jpg The output of cjpeg testimg.ppm + testprog.jpg Progressive-mode equivalent of testorig.jpg. + testimgp.jpg The output of cjpeg -progressive -optimize testimg.ppm +(The first- and second-generation .jpg files aren't identical since JPEG is +lossy.) If you can generate duplicates of the testimg* files then you +probably have working programs. + +With most of the makefiles, "make test" will perform the necessary +comparisons. + +If you're using a makefile that doesn't provide the test option, run djpeg +and cjpeg by hand and compare the output files to testimg* with whatever +binary file comparison tool you have. The files should be bit-for-bit +identical. + +If the programs complain "MAX_ALLOC_CHUNK is wrong, please fix", then you +need to reduce MAX_ALLOC_CHUNK to a value that fits in type size_t. +Try adding "#define MAX_ALLOC_CHUNK 65520L" to jconfig.h. A less likely +configuration error is "ALIGN_TYPE is wrong, please fix": defining ALIGN_TYPE +as long should take care of that one. + +If the cjpeg test run fails with "Missing Huffman code table entry", it's a +good bet that you needed to define RIGHT_SHIFT_IS_UNSIGNED. Go back to the +configuration step and run ckconfig.c. (This is a good plan for any other +test failure, too.) + +If you are using Unix (one-file) command line style on a non-Unix system, +it's a good idea to check that binary I/O through stdin/stdout actually +works. You should get the same results from "djpeg out.ppm" +as from "djpeg -outfile out.ppm testorig.jpg". Note that the makefiles all +use the latter style and therefore do not exercise stdin/stdout! If this +check fails, try recompiling with USE_SETMODE or USE_FDOPEN defined. +If it still doesn't work, better use two-file style. + +If you chose a memory manager other than jmemnobs.c, you should test that +temporary-file usage works. Try "djpeg -bmp -colors 256 -max 0 testorig.jpg" +and make sure its output matches testimg.bmp. If you have any really large +images handy, try compressing them with -optimize and/or decompressing with +-colors 256 to make sure your DEFAULT_MAX_MEM setting is not too large. + +NOTE: this is far from an exhaustive test of the JPEG software; some modules, +such as 1-pass color quantization, are not exercised at all. It's just a +quick test to give you some confidence that you haven't missed something +major. + + +INSTALLING THE SOFTWARE +======================= + +Once you're done with the above steps, you can install the software by +copying the executable files (cjpeg, djpeg, jpegtran, rdjpgcom, and wrjpgcom) +to wherever you normally install programs. On Unix systems, you'll also want +to put the man pages (cjpeg.1, djpeg.1, jpegtran.1, rdjpgcom.1, wrjpgcom.1) +in the man-page directory. The pre-fab makefiles don't support this step +since there's such a wide variety of installation procedures on different +systems. + +If you generated a Makefile with the "configure" script, you can just say + make install +to install the programs and their man pages into the standard places. +(You'll probably need to be root to do this.) We recommend first saying + make -n install +to see where configure thought the files should go. You may need to edit +the Makefile, particularly if your system's conventions for man page +filenames don't match what configure expects. + +If you want to install the IJG library itself, for use in compiling other +programs besides ours, then you need to put the four include files + jpeglib.h jerror.h jconfig.h jmorecfg.h +into your include-file directory, and put the library file libjpeg.a +(extension may vary depending on system) wherever library files go. +If you generated a Makefile with "configure", it will do what it thinks +is the right thing if you say + make install-lib + + +OPTIONAL STUFF +============== + +Progress monitor: + +If you like, you can #define PROGRESS_REPORT (in jconfig.h) to enable display +of percent-done progress reports. The routine provided in cdjpeg.c merely +prints percentages to stderr, but you can customize it to do something +fancier. + +Utah RLE file format support: + +We distribute the software with support for RLE image files (Utah Raster +Toolkit format) disabled, because the RLE support won't compile without the +Utah library. If you have URT version 3.1 or later, you can enable RLE +support as follows: + 1. #define RLE_SUPPORTED in jconfig.h. + 2. Add a -I option to CFLAGS in the Makefile for the directory + containing the URT .h files (typically the "include" + subdirectory of the URT distribution). + 3. Add -L... -lrle to LDLIBS in the Makefile, where ... specifies + the directory containing the URT "librle.a" file (typically the + "lib" subdirectory of the URT distribution). + +Support for 12-bit-deep pixel data: + +The JPEG standard allows either 8-bit or 12-bit data precision. (For color, +this means 8 or 12 bits per channel, of course.) If you need to work with +deeper than 8-bit data, you can compile the IJG code for 12-bit operation. +To do so: + 1. In jmorecfg.h, define BITS_IN_JSAMPLE as 12 rather than 8. + 2. In jconfig.h, undefine BMP_SUPPORTED, RLE_SUPPORTED, and TARGA_SUPPORTED, + because the code for those formats doesn't handle 12-bit data and won't + even compile. (The PPM code does work, as explained below. The GIF + code works too; it scales 8-bit GIF data to and from 12-bit depth + automatically.) + 3. Compile. Don't expect "make test" to pass, since the supplied test + files are for 8-bit data. + +Currently, 12-bit support does not work on 16-bit-int machines. + +Note that a 12-bit version will not read 8-bit JPEG files, nor vice versa; +so you'll want to keep around a regular 8-bit compilation as well. +(Run-time selection of data depth, to allow a single copy that does both, +is possible but would probably slow things down considerably; it's very low +on our to-do list.) + +The PPM reader (rdppm.c) can read 12-bit data from either text-format or +binary-format PPM and PGM files. Binary-format PPM/PGM files which have a +maxval greater than 255 are assumed to use 2 bytes per sample, MSB first +(big-endian order). As of early 1995, 2-byte binary format is not +officially supported by the PBMPLUS library, but it is expected that a +future release of PBMPLUS will support it. Note that the PPM reader will +read files of any maxval regardless of the BITS_IN_JSAMPLE setting; incoming +data is automatically rescaled to either maxval=255 or maxval=4095 as +appropriate for the cjpeg bit depth. + +The PPM writer (wrppm.c) will normally write 2-byte binary PPM or PGM +format, maxval 4095, when compiled with BITS_IN_JSAMPLE=12. Since this +format is not yet widely supported, you can disable it by compiling wrppm.c +with PPM_NORAWWORD defined; then the data is scaled down to 8 bits to make a +standard 1-byte/sample PPM or PGM file. (Yes, this means still another copy +of djpeg to keep around. But hopefully you won't need it for very long. +Poskanzer's supposed to get that new PBMPLUS release out Real Soon Now.) + +Of course, if you are working with 12-bit data, you probably have it stored +in some other, nonstandard format. In that case you'll probably want to +write your own I/O modules to read and write your format. + +Note that a 12-bit version of cjpeg always runs in "-optimize" mode, in +order to generate valid Huffman tables. This is necessary because our +default Huffman tables only cover 8-bit data. + +Removing code: + +If you need to make a smaller version of the JPEG software, some optional +functions can be removed at compile time. See the xxx_SUPPORTED #defines in +jconfig.h and jmorecfg.h. If at all possible, we recommend that you leave in +decoder support for all valid JPEG files, to ensure that you can read anyone's +output. Taking out support for image file formats that you don't use is the +most painless way to make the programs smaller. Another possibility is to +remove some of the DCT methods: in particular, the "IFAST" method may not be +enough faster than the others to be worth keeping on your machine. (If you +do remove ISLOW or IFAST, be sure to redefine JDCT_DEFAULT or JDCT_FASTEST +to a supported method, by adding a #define in jconfig.h.) + + +OPTIMIZATION +============ + +Unless you own a Cray, you'll probably be interested in making the JPEG +software go as fast as possible. This section covers some machine-dependent +optimizations you may want to try. We suggest that before trying any of +this, you first get the basic installation to pass the self-test step. +Repeat the self-test after any optimization to make sure that you haven't +broken anything. + +The integer DCT routines perform a lot of multiplications. These +multiplications must yield 32-bit results, but none of their input values +are more than 16 bits wide. On many machines, notably the 680x0 and 80x86 +CPUs, a 16x16=>32 bit multiply instruction is faster than a full 32x32=>32 +bit multiply. Unfortunately there is no portable way to specify such a +multiplication in C, but some compilers can generate one when you use the +right combination of casts. See the MULTIPLYxxx macro definitions in +jdct.h. If your compiler makes "int" be 32 bits and "short" be 16 bits, +defining SHORTxSHORT_32 is fairly likely to work. When experimenting with +alternate definitions, be sure to test not only whether the code still works +(use the self-test), but also whether it is actually faster --- on some +compilers, alternate definitions may compute the right answer, yet be slower +than the default. Timing cjpeg on a large PGM (grayscale) input file is the +best way to check this, as the DCT will be the largest fraction of the runtime +in that mode. (Note: some of the distributed compiler-specific jconfig files +already contain #define switches to select appropriate MULTIPLYxxx +definitions.) + +If your machine has sufficiently fast floating point hardware, you may find +that the float DCT method is faster than the integer DCT methods, even +after tweaking the integer multiply macros. In that case you may want to +make the float DCT be the default method. (The only objection to this is +that float DCT results may vary slightly across machines.) To do that, add +"#define JDCT_DEFAULT JDCT_FLOAT" to jconfig.h. Even if you don't change +the default, you should redefine JDCT_FASTEST, which is the method selected +by djpeg's -fast switch. Don't forget to update the documentation files +(usage.txt and/or cjpeg.1, djpeg.1) to agree with what you've done. + +If access to "short" arrays is slow on your machine, it may be a win to +define type JCOEF as int rather than short. This will cost a good deal of +memory though, particularly in some multi-pass modes, so don't do it unless +you have memory to burn and short is REALLY slow. + +If your compiler can compile function calls in-line, make sure the INLINE +macro in jmorecfg.h is defined as the keyword that marks a function +inline-able. Some compilers have a switch that tells the compiler to inline +any function it thinks is profitable (e.g., -finline-functions for gcc). +Enabling such a switch is likely to make the compiled code bigger but faster. + +In general, it's worth trying the maximum optimization level of your compiler, +and experimenting with any optional optimizations such as loop unrolling. +(Unfortunately, far too many compilers have optimizer bugs ... be prepared to +back off if the code fails self-test.) If you do any experimentation along +these lines, please report the optimal settings to jpeg-info@uc.ag so we +can mention them in future releases. Be sure to specify your machine +and compiler version. + + +HINTS FOR SPECIFIC SYSTEMS +========================== + +We welcome reports on changes needed for systems not mentioned here. Submit +'em to jpeg-info@uc.ag. Also, if configure or ckconfig.c is wrong about how +to configure the JPEG software for your system, please let us know. + + +Acorn RISC OS: + +(Thanks to Simon Middleton for these hints on compiling with Desktop C.) +After renaming the files according to Acorn conventions, take a copy of +makefile.ansi, change all occurrences of 'libjpeg.a' to 'libjpeg.o' and +change these definitions as indicated: + +CFLAGS= -throwback -IC: -Wn +LDLIBS=C:o.Stubs +SYSDEPMEM=jmemansi.o +LN=Link +AR=LibFile -c -o + +Also add a new line '.c.o:; $(cc) $< $(cflags) -c -o $@'. Remove the +lines '$(RM) libjpeg.o' and '$(AR2) libjpeg.o' and the 'jconfig.h' +dependency section. + +Copy jconfig.txt to jconfig.h. Edit jconfig.h to define TWO_FILE_COMMANDLINE +and CHAR_IS_UNSIGNED. + +Run the makefile using !AMU not !Make. If you want to use the 'clean' and +'test' makefile entries then you will have to fiddle with the syntax a bit +and rename the test files. + + +Amiga: + +SAS C 6.50 reportedly is too buggy to compile the IJG code properly. +A patch to update to 6.51 is available from SAS or AmiNet FTP sites. + +The supplied config files are set up to use jmemname.c as the memory +manager, with temporary files being created on the device named by +"JPEGTMP:". + + +Atari ST/STE/TT: + +Copy the project files makcjpeg.st, makdjpeg.st, maktjpeg.st, and makljpeg.st +to cjpeg.prj, djpeg.prj, jpegtran.prj, and libjpeg.prj respectively. The +project files should work as-is with Pure C. For Turbo C, change library +filenames "pc..." to "tc..." in each project file. Note that libjpeg.prj +selects jmemansi.c as the recommended memory manager. You'll probably want to +adjust the DEFAULT_MAX_MEM setting --- you want it to be a couple hundred K +less than your normal free memory. Put "#define DEFAULT_MAX_MEM nnnn" into +jconfig.h to do this. + +To use the 68881/68882 coprocessor for the floating point DCT, add the +compiler option "-8" to the project files and replace pcfltlib.lib with +pc881lib.lib in cjpeg.prj and djpeg.prj. Or if you don't have a +coprocessor, you may prefer to remove the float DCT code by undefining +DCT_FLOAT_SUPPORTED in jmorecfg.h (since without a coprocessor, the float +code will be too slow to be useful). In that case, you can delete +pcfltlib.lib from the project files. + +Note that you must make libjpeg.lib before making cjpeg.ttp, djpeg.ttp, +or jpegtran.ttp. You'll have to perform the self-test by hand. + +We haven't bothered to include project files for rdjpgcom and wrjpgcom. +Those source files should just be compiled by themselves; they don't +depend on the JPEG library. You can use the default.prj project file +of the Pure C distribution to make the programs. + +There is a bug in some older versions of the Turbo C library which causes the +space used by temporary files created with "tmpfile()" not to be freed after +an abnormal program exit. If you check your disk afterwards, you will find +cluster chains that are allocated but not used by a file. This should not +happen in cjpeg/djpeg/jpegtran, since we enable a signal catcher to explicitly +close temp files before exiting. But if you use the JPEG library with your +own code, be sure to supply a signal catcher, or else use a different +system-dependent memory manager. + + +Cray: + +Should you be so fortunate as to be running JPEG on a Cray YMP, there is a +compiler bug in old versions of Cray's Standard C (prior to 3.1). If you +still have an old compiler, you'll need to insert a line reading +"#pragma novector" just before the loop + for (i = 1; i <= (int) htbl->bits[l]; i++) + huffsize[p++] = (char) l; +in fix_huff_tbl (in V5beta1, line 204 of jchuff.c and line 176 of jdhuff.c). +[This bug may or may not still occur with the current IJG code, but it's +probably a dead issue anyway...] + + +HP-UX: + +If you have HP-UX 7.05 or later with the "software development" C compiler, +you should run the compiler in ANSI mode. If using the configure script, +say + ./configure CC='cc -Aa' +(or -Ae if you prefer). If configuring by hand, use makefile.ansi and add +"-Aa" to the CFLAGS line in the makefile. + +If you have a pre-7.05 system, or if you are using the non-ANSI C compiler +delivered with a minimum HP-UX system, then you must use makefile.unix +(and do NOT add -Aa); or just run configure without the CC option. + +On HP 9000 series 800 machines, the HP C compiler is buggy in revisions prior +to A.08.07. If you get complaints about "not a typedef name", you'll have to +use makefile.unix, or run configure without the CC option. + + +Macintosh, generic comments: + +The supplied user-interface files (cjpeg.c, djpeg.c, etc) are set up to +provide a Unix-style command line interface. You can use this interface on +the Mac by means of the ccommand() library routine provided by Metrowerks +CodeWarrior or Think C. This is only appropriate for testing the library, +however; to make a user-friendly equivalent of cjpeg/djpeg you'd really want +to develop a Mac-style user interface. There isn't a complete example +available at the moment, but there are some helpful starting points: +1. Sam Bushell's free "To JPEG" applet provides drag-and-drop conversion to +JPEG under System 7 and later. This only illustrates how to use the +compression half of the library, but it does a very nice job of that part. +The CodeWarrior source code is available from http://www.pobox.com/~jsam. +2. Jim Brunner prepared a Mac-style user interface for both compression and +decompression. Unfortunately, it hasn't been updated since IJG v4, and +the library's API has changed considerably since then. Still it may be of +some help, particularly as a guide to compiling the IJG code under Think C. +Jim's code is available from the Info-Mac archives, at sumex-aim.stanford.edu +or mirrors thereof; see file /info-mac/dev/src/jpeg-convert-c.hqx. + +jmemmac.c is the recommended memory manager back end for Macintosh. It uses +NewPtr/DisposePtr instead of malloc/free, and has a Mac-specific +implementation of jpeg_mem_available(). It also creates temporary files that +follow Mac conventions. (That part of the code relies on System-7-or-later OS +functions. See the comments in jmemmac.c if you need to run it on System 6.) +NOTE that USE_MAC_MEMMGR must be defined in jconfig.h to use jmemmac.c. + +You can also use jmemnobs.c, if you don't care about handling images larger +than available memory. If you use any memory manager back end other than +jmemmac.c, we recommend replacing "malloc" and "free" by "NewPtr" and +"DisposePtr", because Mac C libraries often have peculiar implementations of +malloc/free. (For instance, free() may not return the freed space to the +Mac Memory Manager. This is undesirable for the IJG code because jmemmgr.c +already clumps space requests.) + + +Macintosh, Metrowerks CodeWarrior: + +The Unix-command-line-style interface can be used by defining USE_CCOMMAND. +You'll also need to define TWO_FILE_COMMANDLINE to avoid stdin/stdout. +This means that when using the cjpeg/djpeg programs, you'll have to type the +input and output file names in the "Arguments" text-edit box, rather than +using the file radio buttons. (Perhaps USE_FDOPEN or USE_SETMODE would +eliminate the problem, but I haven't heard from anyone who's tried it.) + +On 680x0 Macs, Metrowerks defines type "double" as a 10-byte IEEE extended +float. jmemmgr.c won't like this: it wants sizeof(ALIGN_TYPE) to be a power +of 2. Add "#define ALIGN_TYPE long" to jconfig.h to eliminate the complaint. + +The supplied configuration file jconfig.mac can be used for your jconfig.h; +it includes all the recommended symbol definitions. If you have AppleScript +installed, you can run the supplied script makeproj.mac to create CodeWarrior +project files for the library and the testbed applications, then build the +library and applications. (Thanks to Dan Sears and Don Agro for this nifty +hack, which saves us from trying to maintain CodeWarrior project files as part +of the IJG distribution...) + + +Macintosh, Think C: + +The documentation in Jim Brunner's "JPEG Convert" source code (see above) +includes detailed build instructions for Think C; it's probably somewhat +out of date for the current release, but may be helpful. + +If you want to build the minimal command line version, proceed as follows. +You'll have to prepare project files for the programs; we don't include any +in the distribution since they are not text files. Use the file lists in +any of the supplied makefiles as a guide. Also add the ANSI and Unix C +libraries in a separate segment. You may need to divide the JPEG files into +more than one segment; we recommend dividing compression and decompression +modules. Define USE_CCOMMAND in jconfig.h so that the ccommand() routine is +called. You must also define TWO_FILE_COMMANDLINE because stdin/stdout +don't handle binary data correctly. + +On 680x0 Macs, Think C defines type "double" as a 12-byte IEEE extended float. +jmemmgr.c won't like this: it wants sizeof(ALIGN_TYPE) to be a power of 2. +Add "#define ALIGN_TYPE long" to jconfig.h to eliminate the complaint. + +jconfig.mac should work as a jconfig.h configuration file for Think C, +but the makeproj.mac AppleScript script is specific to CodeWarrior. Sorry. + + +MIPS R3000: + +MIPS's cc version 1.31 has a rather nasty optimization bug. Don't use -O +if you have that compiler version. (Use "cc -V" to check the version.) +Note that the R3000 chip is found in workstations from DEC and others. + + +MS-DOS, generic comments for 16-bit compilers: + +The IJG code is designed to work well in 80x86 "small" or "medium" memory +models (i.e., data pointers are 16 bits unless explicitly declared "far"; +code pointers can be either size). You may be able to use small model to +compile cjpeg or djpeg by itself, but you will probably have to use medium +model for any larger application. This won't make much difference in +performance. You *will* take a noticeable performance hit if you use a +large-data memory model, and you should avoid "huge" model if at all +possible. Be sure that NEED_FAR_POINTERS is defined in jconfig.h if you use +a small-data memory model; be sure it is NOT defined if you use a large-data +model. (The supplied makefiles and jconfig files for Borland and Microsoft C +compile in medium model and define NEED_FAR_POINTERS.) + +The DOS-specific memory manager, jmemdos.c, should be used if possible. +It needs some assembly-code routines which are in jmemdosa.asm; make sure +your makefile assembles that file and includes it in the library. If you +don't have a suitable assembler, you can get pre-assembled object files for +jmemdosa by FTP from ftp.uu.net:/graphics/jpeg/jdosaobj.zip. (DOS-oriented +distributions of the IJG source code often include these object files.) + +When using jmemdos.c, jconfig.h must define USE_MSDOS_MEMMGR and must set +MAX_ALLOC_CHUNK to less than 64K (65520L is a typical value). If your +C library's far-heap malloc() can't allocate blocks that large, reduce +MAX_ALLOC_CHUNK to whatever it can handle. + +If you can't use jmemdos.c for some reason --- for example, because you +don't have an assembler to assemble jmemdosa.asm --- you'll have to fall +back to jmemansi.c or jmemname.c. You'll probably still need to set +MAX_ALLOC_CHUNK in jconfig.h, because most DOS C libraries won't malloc() +more than 64K at a time. IMPORTANT: if you use jmemansi.c or jmemname.c, +you will have to compile in a large-data memory model in order to get the +right stdio library. Too bad. + +wrjpgcom needs to be compiled in large model, because it malloc()s a 64KB +work area to hold the comment text. If your C library's malloc can't +handle that, reduce MAX_COM_LENGTH as necessary in wrjpgcom.c. + +Most MS-DOS compilers treat stdin/stdout as text files, so you must use +two-file command line style. But if your compiler has either fdopen() or +setmode(), you can use one-file style if you like. To do this, define +USE_SETMODE or USE_FDOPEN so that stdin/stdout will be set to binary mode. +(USE_SETMODE seems to work with more DOS compilers than USE_FDOPEN.) You +should test that I/O through stdin/stdout produces the same results as I/O +to explicitly named files... the "make test" procedures in the supplied +makefiles do NOT use stdin/stdout. + + +MS-DOS, generic comments for 32-bit compilers: + +None of the above comments about memory models apply if you are using a +32-bit flat-memory-space environment, such as DJGPP or Watcom C. (And you +should use one if you have it, as performance will be much better than +8086-compatible code!) For flat-memory-space compilers, do NOT define +NEED_FAR_POINTERS, and do NOT use jmemdos.c. Use jmemnobs.c if the +environment supplies adequate virtual memory, otherwise use jmemansi.c or +jmemname.c. + +You'll still need to be careful about binary I/O through stdin/stdout. +See the last paragraph of the previous section. + + +MS-DOS, Borland C: + +Be sure to convert all the source files to DOS text format (CR/LF newlines). +Although Borland C will often work OK with unmodified Unix (LF newlines) +source files, sometimes it will give bogus compile errors. +"Illegal character '#'" is the most common such error. (This is true with +Borland C 3.1, but perhaps is fixed in newer releases.) + +If you want one-file command line style, just undefine TWO_FILE_COMMANDLINE. +jconfig.bcc already includes #define USE_SETMODE to make this work. +(fdopen does not work correctly.) + + +MS-DOS, Microsoft C: + +makefile.mc6 works with Microsoft C, DOS Visual C++, etc. It should only +be used if you want to build a 16-bit (small or medium memory model) program. + +If you want one-file command line style, just undefine TWO_FILE_COMMANDLINE. +jconfig.mc6 already includes #define USE_SETMODE to make this work. +(fdopen does not work correctly.) + +Note that this makefile assumes that the working copy of itself is called +"makefile". If you want to call it something else, say "makefile.mak", +be sure to adjust the dependency line that reads "$(RFILE) : makefile". +Otherwise the make will fail because it doesn't know how to create "makefile". +Worse, some releases of Microsoft's make utilities give an incorrect error +message in this situation. + +Old versions of MS C fail with an "out of macro expansion space" error +because they can't cope with the macro TRACEMS8 (defined in jerror.h). +If this happens to you, the easiest solution is to change TRACEMS8 to +expand to nothing. You'll lose the ability to dump out JPEG coefficient +tables with djpeg -debug -debug, but at least you can compile. + +Original MS C 6.0 is very buggy; it compiles incorrect code unless you turn +off optimization entirely (remove -O from CFLAGS). 6.00A is better, but it +still generates bad code if you enable loop optimizations (-Ol or -Ox). + +MS C 8.0 crashes when compiling jquant1.c with optimization switch /Oo ... +which is on by default. To work around this bug, compile that one file +with /Oo-. + + +Microsoft Windows (all versions), generic comments: + +Some Windows system include files define typedef boolean as "unsigned char". +The IJG code also defines typedef boolean, but we make it "int" by default. +This doesn't affect the IJG programs because we don't import those Windows +include files. But if you use the JPEG library in your own program, and some +of your program's files import one definition of boolean while some import the +other, you can get all sorts of mysterious problems. A good preventive step +is to make the IJG library use "unsigned char" for boolean. To do that, +add something like this to your jconfig.h file: + /* Define "boolean" as unsigned char, not int, per Windows custom */ + #ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ + typedef unsigned char boolean; + #endif + #define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ +(This is already in jconfig.vc, by the way.) + +windef.h contains the declarations + #define far + #define FAR far +Since jmorecfg.h tries to define FAR as empty, you may get a compiler +warning if you include both jpeglib.h and windef.h (which windows.h +includes). To suppress the warning, you can put "#ifndef FAR"/"#endif" +around the line "#define FAR" in jmorecfg.h. +(Something like this is already in jmorecfg.h, by the way.) + +When using the library in a Windows application, you will almost certainly +want to modify or replace the error handler module jerror.c, since our +default error handler does a couple of inappropriate things: + 1. it tries to write error and warning messages on stderr; + 2. in event of a fatal error, it exits by calling exit(). + +A simple stopgap solution for problem 1 is to replace the line + fprintf(stderr, "%s\n", buffer); +(in output_message in jerror.c) with + MessageBox(GetActiveWindow(),buffer,"JPEG Error",MB_OK|MB_ICONERROR); +It's highly recommended that you at least do that much, since otherwise +error messages will disappear into nowhere. (Beginning with IJG v6b, this +code is already present in jerror.c; just define USE_WINDOWS_MESSAGEBOX in +jconfig.h to enable it.) + +The proper solution for problem 2 is to return control to your calling +application after a library error. This can be done with the setjmp/longjmp +technique discussed in libjpeg.txt and illustrated in example.c. (NOTE: +some older Windows C compilers provide versions of setjmp/longjmp that +don't actually work under Windows. You may need to use the Windows system +functions Catch and Throw instead.) + +The recommended memory manager under Windows is jmemnobs.c; in other words, +let Windows do any virtual memory management needed. You should NOT use +jmemdos.c nor jmemdosa.asm under Windows. + +For Windows 3.1, we recommend compiling in medium or large memory model; +for newer Windows versions, use a 32-bit flat memory model. (See the MS-DOS +sections above for more info about memory models.) In the 16-bit memory +models only, you'll need to put + #define MAX_ALLOC_CHUNK 65520L /* Maximum request to malloc() */ +into jconfig.h to limit allocation chunks to 64Kb. (Without that, you'd +have to use huge memory model, which slows things down unnecessarily.) +jmemnobs.c works without modification in large or flat memory models, but to +use medium model, you need to modify its jpeg_get_large and jpeg_free_large +routines to allocate far memory. In any case, you might like to replace +its calls to malloc and free with direct calls on Windows memory allocation +functions. + +You may also want to modify jdatasrc.c and jdatadst.c to use Windows file +operations rather than fread/fwrite. This is only necessary if your C +compiler doesn't provide a competent implementation of C stdio functions. + +You might want to tweak the RGB_xxx macros in jmorecfg.h so that the library +will accept or deliver color pixels in BGR sample order, not RGB; BGR order +is usually more convenient under Windows. Note that this change will break +the sample applications cjpeg/djpeg, but the library itself works fine. + + +Many people want to convert the IJG library into a DLL. This is reasonably +straightforward, but watch out for the following: + + 1. Don't try to compile as a DLL in small or medium memory model; use +large model, or even better, 32-bit flat model. Many places in the IJG code +assume the address of a local variable is an ordinary (not FAR) pointer; +that isn't true in a medium-model DLL. + + 2. Microsoft C cannot pass file pointers between applications and DLLs. +(See Microsoft Knowledge Base, PSS ID Number Q50336.) So jdatasrc.c and +jdatadst.c don't work if you open a file in your application and then pass +the pointer to the DLL. One workaround is to make jdatasrc.c/jdatadst.c +part of your main application rather than part of the DLL. + + 3. You'll probably need to modify the macros GLOBAL() and EXTERN() to +attach suitable linkage keywords to the exported routine names. Similarly, +you'll want to modify METHODDEF() and JMETHOD() to ensure function pointers +are declared in a way that lets application routines be called back through +the function pointers. These macros are in jmorecfg.h. Typical definitions +for a 16-bit DLL are: + #define GLOBAL(type) type _far _pascal _loadds _export + #define EXTERN(type) extern type _far _pascal _loadds + #define METHODDEF(type) static type _far _pascal + #define JMETHOD(type,methodname,arglist) \ + type (_far _pascal *methodname) arglist +For a 32-bit DLL you may want something like + #define GLOBAL(type) __declspec(dllexport) type + #define EXTERN(type) extern __declspec(dllexport) type +Although not all the GLOBAL routines are actually intended to be called by +the application, the performance cost of making them all DLL entry points is +negligible. + +The unmodified IJG library presents a very C-specific application interface, +so the resulting DLL is only usable from C or C++ applications. There has +been some talk of writing wrapper code that would present a simpler interface +usable from other languages, such as Visual Basic. This is on our to-do list +but hasn't been very high priority --- any volunteers out there? + + +Microsoft Windows, Borland C: + +The provided jconfig.bcc should work OK in a 32-bit Windows environment, +but you'll need to tweak it in a 16-bit environment (you'd need to define +NEED_FAR_POINTERS and MAX_ALLOC_CHUNK). Beware that makefile.bcc will need +alteration if you want to use it for Windows --- in particular, you should +use jmemnobs.c not jmemdos.c under Windows. + +Borland C++ 4.5 fails with an internal compiler error when trying to compile +jdmerge.c in 32-bit mode. If enough people complain, perhaps Borland will fix +it. In the meantime, the simplest known workaround is to add a redundant +definition of the variable range_limit in h2v1_merged_upsample(), at the head +of the block that handles odd image width (about line 268 in v6 jdmerge.c): + /* If image width is odd, do the last output column separately */ + if (cinfo->output_width & 1) { + register JSAMPLE * range_limit = cinfo->sample_range_limit; /* ADD THIS */ + cb = GETJSAMPLE(*inptr1); +Pretty bizarre, especially since the very similar routine h2v2_merged_upsample +doesn't trigger the bug. +Recent reports suggest that this bug does not occur with "bcc32a" (the +Pentium-optimized version of the compiler). + +Another report from a user of Borland C 4.5 was that incorrect code (leading +to a color shift in processed images) was produced if any of the following +optimization switch combinations were used: + -Ot -Og + -Ot -Op + -Ot -Om +So try backing off on optimization if you see such a problem. (Are there +several different releases all numbered "4.5"??) + + +Microsoft Windows, Microsoft Visual C++: + +jconfig.vc should work OK with any Microsoft compiler for a 32-bit memory +model. makefile.vc is intended for command-line use. (If you are using +the Developer Studio environment, you may prefer the DevStudio project +files; see below.) + +IJG JPEG 7 adds extern "C" to jpeglib.h. This avoids the need to put +extern "C" { ... } around #include "jpeglib.h" in your C++ application. +You can also force VC++ to treat the library as C++ code by renaming +all the *.c files to *.cpp (and adjusting the makefile to match). +In this case you also need to define the symbol DONT_USE_EXTERN_C in +the configuration to prevent jpeglib.h from using extern "C". + + +Microsoft Windows, Microsoft Visual C++ 6 Developer Studio: + +We include makefiles that should work as project files in DevStudio 6.0 or +later. There is a library makefile that builds the IJG library as a static +Win32 library, and application makefiles that build the sample applications +as Win32 console applications. (Even if you only want the library, we +recommend building the applications so that you can run the self-test.) + +To use: +1. Open the command prompt, change to the main directory and execute the + command line + NMAKE /f makefile.vc setup-vc6 + This will move jconfig.vc to jconfig.h and makefiles to project files. + (Note that the renaming is critical!) +2. Open the workspace file jpeg.dsw, build the library project. + (If you are using DevStudio more recent than 6.0, you'll probably + get a message saying that the project files are being updated.) +3. Open the workspace file apps.dsw, build the application projects. +4. To perform the self-test, execute the command line + NMAKE /f makefile.vc test-build +5. Move the application .exe files from `app`\Release to an + appropriate location on your path. + + +Microsoft Windows, Microsoft Visual C++ 2010 Developer Studio (v10): + +We include makefiles that should work as project files in Visual Studio +2010 or later. There is a library makefile that builds the IJG library +as a static Win32 library, and application makefiles that build the sample +applications as Win32 console applications. (Even if you only want the +library, we recommend building the applications so that you can run the +self-test.) + +To use: +1. Open the command prompt, change to the main directory and execute the + command line + NMAKE /f makefile.vc setup-v10 + This will move jconfig.vc to jconfig.h and makefiles to project files. + (Note that the renaming is critical!) +2. Open the solution file jpeg.sln, build the library project. + (If you are using Visual Studio more recent than 2010 (v10), you'll + probably get a message saying that the project files are being updated.) +3. Open the solution file apps.sln, build the application projects. +4. To perform the self-test, execute the command line + NMAKE /f makefile.vc test-build +5. Move the application .exe files from `app`\Release to an + appropriate location on your path. + +Note: +There seems to be an optimization bug in the compiler which causes the +self-test to fail with the color quantization option. +We have disabled optimization for the file jquant2.c in the library +project file which causes the self-test to pass properly. + + +OS/2, Borland C++: + +Watch out for optimization bugs in older Borland compilers; you may need +to back off the optimization switch settings. See the comments in +makefile.bcc. + + +SGI: + +On some SGI systems, you may need to set "AR2= ar -ts" in the Makefile. +If you are using configure, you can do this by saying + ./configure RANLIB='ar -ts' +This change is not needed on all SGIs. Use it only if the make fails at the +stage of linking the completed programs. + +On the MIPS R4000 architecture (Indy, etc.), the compiler option "-mips2" +reportedly speeds up the float DCT method substantially, enough to make it +faster than the default int method (but still slower than the fast int +method). If you use -mips2, you may want to alter the default DCT method to +be float. To do this, put "#define JDCT_DEFAULT JDCT_FLOAT" in jconfig.h. + + +VMS: + +On an Alpha/VMS system with MMS, be sure to use the "/Marco=Alpha=1" +qualifier with MMS when building the JPEG package. + +VAX/VMS v5.5-1 may have problems with the test step of the build procedure +reporting differences when it compares the original and test images. If the +error points to the last block of the files, it is most likely bogus and may +be safely ignored. It seems to be because the files are Stream_LF and +Backup/Compare has difficulty with the (presumably) null padded files. +This problem was not observed on VAX/VMS v6.1 or AXP/VMS v6.1. diff --git a/jpeg-8c/jaricom.c b/jpeg-8c/jaricom.c new file mode 100644 index 00000000..f43e2ea7 --- /dev/null +++ b/jpeg-8c/jaricom.c @@ -0,0 +1,153 @@ +/* + * jaricom.c + * + * Developed 1997-2009 by Guido Vollbeding. + * 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 probability estimation tables for common use in + * arithmetic entropy encoding and decoding routines. + * + * This data represents Table D.2 in the JPEG spec (ISO/IEC IS 10918-1 + * and CCITT Recommendation ITU-T T.81) and Table 24 in the JBIG spec + * (ISO/IEC IS 11544 and CCITT Recommendation ITU-T T.82). + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +/* The following #define specifies the packing of the four components + * into the compact INT32 representation. + * Note that this formula must match the actual arithmetic encoder + * and decoder implementation. The implementation has to be changed + * if this formula is changed. + * The current organization is leaned on Markus Kuhn's JBIG + * implementation (jbig_tab.c). + */ + +#define V(i,a,b,c,d) (((INT32)a << 16) | ((INT32)c << 8) | ((INT32)d << 7) | b) + +const INT32 jpeg_aritab[113+1] = { +/* + * Index, Qe_Value, Next_Index_LPS, Next_Index_MPS, Switch_MPS + */ + V( 0, 0x5a1d, 1, 1, 1 ), + V( 1, 0x2586, 14, 2, 0 ), + V( 2, 0x1114, 16, 3, 0 ), + V( 3, 0x080b, 18, 4, 0 ), + V( 4, 0x03d8, 20, 5, 0 ), + V( 5, 0x01da, 23, 6, 0 ), + V( 6, 0x00e5, 25, 7, 0 ), + V( 7, 0x006f, 28, 8, 0 ), + V( 8, 0x0036, 30, 9, 0 ), + V( 9, 0x001a, 33, 10, 0 ), + V( 10, 0x000d, 35, 11, 0 ), + V( 11, 0x0006, 9, 12, 0 ), + V( 12, 0x0003, 10, 13, 0 ), + V( 13, 0x0001, 12, 13, 0 ), + V( 14, 0x5a7f, 15, 15, 1 ), + V( 15, 0x3f25, 36, 16, 0 ), + V( 16, 0x2cf2, 38, 17, 0 ), + V( 17, 0x207c, 39, 18, 0 ), + V( 18, 0x17b9, 40, 19, 0 ), + V( 19, 0x1182, 42, 20, 0 ), + V( 20, 0x0cef, 43, 21, 0 ), + V( 21, 0x09a1, 45, 22, 0 ), + V( 22, 0x072f, 46, 23, 0 ), + V( 23, 0x055c, 48, 24, 0 ), + V( 24, 0x0406, 49, 25, 0 ), + V( 25, 0x0303, 51, 26, 0 ), + V( 26, 0x0240, 52, 27, 0 ), + V( 27, 0x01b1, 54, 28, 0 ), + V( 28, 0x0144, 56, 29, 0 ), + V( 29, 0x00f5, 57, 30, 0 ), + V( 30, 0x00b7, 59, 31, 0 ), + V( 31, 0x008a, 60, 32, 0 ), + V( 32, 0x0068, 62, 33, 0 ), + V( 33, 0x004e, 63, 34, 0 ), + V( 34, 0x003b, 32, 35, 0 ), + V( 35, 0x002c, 33, 9, 0 ), + V( 36, 0x5ae1, 37, 37, 1 ), + V( 37, 0x484c, 64, 38, 0 ), + V( 38, 0x3a0d, 65, 39, 0 ), + V( 39, 0x2ef1, 67, 40, 0 ), + V( 40, 0x261f, 68, 41, 0 ), + V( 41, 0x1f33, 69, 42, 0 ), + V( 42, 0x19a8, 70, 43, 0 ), + V( 43, 0x1518, 72, 44, 0 ), + V( 44, 0x1177, 73, 45, 0 ), + V( 45, 0x0e74, 74, 46, 0 ), + V( 46, 0x0bfb, 75, 47, 0 ), + V( 47, 0x09f8, 77, 48, 0 ), + V( 48, 0x0861, 78, 49, 0 ), + V( 49, 0x0706, 79, 50, 0 ), + V( 50, 0x05cd, 48, 51, 0 ), + V( 51, 0x04de, 50, 52, 0 ), + V( 52, 0x040f, 50, 53, 0 ), + V( 53, 0x0363, 51, 54, 0 ), + V( 54, 0x02d4, 52, 55, 0 ), + V( 55, 0x025c, 53, 56, 0 ), + V( 56, 0x01f8, 54, 57, 0 ), + V( 57, 0x01a4, 55, 58, 0 ), + V( 58, 0x0160, 56, 59, 0 ), + V( 59, 0x0125, 57, 60, 0 ), + V( 60, 0x00f6, 58, 61, 0 ), + V( 61, 0x00cb, 59, 62, 0 ), + V( 62, 0x00ab, 61, 63, 0 ), + V( 63, 0x008f, 61, 32, 0 ), + V( 64, 0x5b12, 65, 65, 1 ), + V( 65, 0x4d04, 80, 66, 0 ), + V( 66, 0x412c, 81, 67, 0 ), + V( 67, 0x37d8, 82, 68, 0 ), + V( 68, 0x2fe8, 83, 69, 0 ), + V( 69, 0x293c, 84, 70, 0 ), + V( 70, 0x2379, 86, 71, 0 ), + V( 71, 0x1edf, 87, 72, 0 ), + V( 72, 0x1aa9, 87, 73, 0 ), + V( 73, 0x174e, 72, 74, 0 ), + V( 74, 0x1424, 72, 75, 0 ), + V( 75, 0x119c, 74, 76, 0 ), + V( 76, 0x0f6b, 74, 77, 0 ), + V( 77, 0x0d51, 75, 78, 0 ), + V( 78, 0x0bb6, 77, 79, 0 ), + V( 79, 0x0a40, 77, 48, 0 ), + V( 80, 0x5832, 80, 81, 1 ), + V( 81, 0x4d1c, 88, 82, 0 ), + V( 82, 0x438e, 89, 83, 0 ), + V( 83, 0x3bdd, 90, 84, 0 ), + V( 84, 0x34ee, 91, 85, 0 ), + V( 85, 0x2eae, 92, 86, 0 ), + V( 86, 0x299a, 93, 87, 0 ), + V( 87, 0x2516, 86, 71, 0 ), + V( 88, 0x5570, 88, 89, 1 ), + V( 89, 0x4ca9, 95, 90, 0 ), + V( 90, 0x44d9, 96, 91, 0 ), + V( 91, 0x3e22, 97, 92, 0 ), + V( 92, 0x3824, 99, 93, 0 ), + V( 93, 0x32b4, 99, 94, 0 ), + V( 94, 0x2e17, 93, 86, 0 ), + V( 95, 0x56a8, 95, 96, 1 ), + V( 96, 0x4f46, 101, 97, 0 ), + V( 97, 0x47e5, 102, 98, 0 ), + V( 98, 0x41cf, 103, 99, 0 ), + V( 99, 0x3c3d, 104, 100, 0 ), + V( 100, 0x375e, 99, 93, 0 ), + V( 101, 0x5231, 105, 102, 0 ), + V( 102, 0x4c0f, 106, 103, 0 ), + V( 103, 0x4639, 107, 104, 0 ), + V( 104, 0x415e, 103, 99, 0 ), + V( 105, 0x5627, 105, 106, 1 ), + V( 106, 0x50e7, 108, 107, 0 ), + V( 107, 0x4b85, 109, 103, 0 ), + V( 108, 0x5597, 110, 109, 0 ), + V( 109, 0x504f, 111, 107, 0 ), + V( 110, 0x5a10, 110, 111, 1 ), + V( 111, 0x5522, 112, 109, 0 ), + V( 112, 0x59eb, 112, 111, 1 ), +/* + * This last entry is used for fixed probability estimate of 0.5 + * as recommended in Section 10.3 Table 5 of ITU-T Rec. T.851. + */ + V( 113, 0x5a1d, 113, 113, 0 ) +}; diff --git a/jpeg-8c/jaricom.lo b/jpeg-8c/jaricom.lo new file mode 100644 index 00000000..c41960b9 --- /dev/null +++ b/jpeg-8c/jaricom.lo @@ -0,0 +1,12 @@ +# jaricom.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jaricom.o' + +# Name of the non-PIC object +non_pic_object='jaricom.o' + diff --git a/jpeg-8c/jcapimin.c b/jpeg-8c/jcapimin.c new file mode 100644 index 00000000..639ce86f --- /dev/null +++ b/jpeg-8c/jcapimin.c @@ -0,0 +1,288 @@ +/* + * jcapimin.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * Modified 2003-2010 by Guido Vollbeding. + * 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; + cinfo->q_scale_factor[i] = 100; + } + + for (i = 0; i < NUM_HUFF_TBLS; i++) { + cinfo->dc_huff_tbl_ptrs[i] = NULL; + cinfo->ac_huff_tbl_ptrs[i] = NULL; + } + + /* Must do it here for emit_dqt in case jpeg_write_tables is used */ + cinfo->block_size = DCTSIZE; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + + 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/jpeg-8c/jcapimin.lo b/jpeg-8c/jcapimin.lo new file mode 100644 index 00000000..ff79217e --- /dev/null +++ b/jpeg-8c/jcapimin.lo @@ -0,0 +1,12 @@ +# jcapimin.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jcapimin.o' + +# Name of the non-PIC object +non_pic_object='jcapimin.o' + diff --git a/jpeg-8c/jcapistd.c b/jpeg-8c/jcapistd.c new file mode 100644 index 00000000..c0320b1b --- /dev/null +++ b/jpeg-8c/jcapistd.c @@ -0,0 +1,161 @@ +/* + * 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/jpeg-8c/jcapistd.lo b/jpeg-8c/jcapistd.lo new file mode 100644 index 00000000..263d2087 --- /dev/null +++ b/jpeg-8c/jcapistd.lo @@ -0,0 +1,12 @@ +# jcapistd.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jcapistd.o' + +# Name of the non-PIC object +non_pic_object='jcapistd.o' + diff --git a/jpeg-8c/jcarith.c b/jpeg-8c/jcarith.c new file mode 100644 index 00000000..0b7ea55d --- /dev/null +++ b/jpeg-8c/jcarith.c @@ -0,0 +1,934 @@ +/* + * jcarith.c + * + * Developed 1997-2009 by Guido Vollbeding. + * 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 portable arithmetic entropy encoding routines for JPEG + * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81). + * + * Both sequential and progressive modes are supported in this single module. + * + * Suspension is not currently supported in this module. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Expanded entropy encoder object for arithmetic encoding. */ + +typedef struct { + struct jpeg_entropy_encoder pub; /* public fields */ + + INT32 c; /* C register, base of coding interval, layout as in sec. D.1.3 */ + INT32 a; /* A register, normalized size of coding interval */ + INT32 sc; /* counter for stacked 0xFF values which might overflow */ + INT32 zc; /* counter for pending 0x00 output values which might * + * be discarded at the end ("Pacman" termination) */ + int ct; /* bit shift counter, determines when next byte will be written */ + int buffer; /* buffer for most recent output byte != 0xFF */ + + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ + int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */ + + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + int next_restart_num; /* next restart number to write (0-7) */ + + /* Pointers to statistics areas (these workspaces have image lifespan) */ + unsigned char * dc_stats[NUM_ARITH_TBLS]; + unsigned char * ac_stats[NUM_ARITH_TBLS]; + + /* Statistics bin for coding with fixed probability 0.5 */ + unsigned char fixed_bin[4]; +} arith_entropy_encoder; + +typedef arith_entropy_encoder * arith_entropy_ptr; + +/* The following two definitions specify the allocation chunk size + * for the statistics area. + * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least + * 49 statistics bins for DC, and 245 statistics bins for AC coding. + * + * We use a compact representation with 1 byte per statistics bin, + * thus the numbers directly represent byte sizes. + * This 1 byte per statistics bin contains the meaning of the MPS + * (more probable symbol) in the highest bit (mask 0x80), and the + * index into the probability estimation state machine table + * in the lower bits (mask 0x7F). + */ + +#define DC_STAT_BINS 64 +#define AC_STAT_BINS 256 + +/* NOTE: Uncomment the following #define if you want to use the + * given formula for calculating the AC conditioning parameter Kx + * for spectral selection progressive coding in section G.1.3.2 + * of the spec (Kx = Kmin + SRL (8 + Se - Kmin) 4). + * Although the spec and P&M authors claim that this "has proven + * to give good results for 8 bit precision samples", I'm not + * convinced yet that this is really beneficial. + * Early tests gave only very marginal compression enhancements + * (a few - around 5 or so - bytes even for very large files), + * which would turn out rather negative if we'd suppress the + * DAC (Define Arithmetic Conditioning) marker segments for + * the default parameters in the future. + * Note that currently the marker writing module emits 12-byte + * DAC segments for a full-component scan in a color image. + * This is not worth worrying about IMHO. However, since the + * spec defines the default values to be used if the tables + * are omitted (unlike Huffman tables, which are required + * anyway), one might optimize this behaviour in the future, + * and then it would be disadvantageous to use custom tables if + * they don't provide sufficient gain to exceed the DAC size. + * + * On the other hand, I'd consider it as a reasonable result + * that the conditioning has no significant influence on the + * compression performance. This means that the basic + * statistical model is already rather stable. + * + * Thus, at the moment, we use the default conditioning values + * anyway, and do not use the custom formula. + * +#define CALCULATE_SPECTRAL_CONDITIONING + */ + +/* 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 + + +LOCAL(void) +emit_byte (int val, j_compress_ptr cinfo) +/* Write next output byte; we do not support suspension in this module. */ +{ + 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); +} + + +/* + * Finish up at the end of an arithmetic-compressed scan. + */ + +METHODDEF(void) +finish_pass (j_compress_ptr cinfo) +{ + arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy; + INT32 temp; + + /* Section D.1.8: Termination of encoding */ + + /* Find the e->c in the coding interval with the largest + * number of trailing zero bits */ + if ((temp = (e->a - 1 + e->c) & 0xFFFF0000L) < e->c) + e->c = temp + 0x8000L; + else + e->c = temp; + /* Send remaining bytes to output */ + e->c <<= e->ct; + if (e->c & 0xF8000000L) { + /* One final overflow has to be handled */ + if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer + 1, cinfo); + if (e->buffer + 1 == 0xFF) + emit_byte(0x00, cinfo); + } + e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */ + e->sc = 0; + } else { + if (e->buffer == 0) + ++e->zc; + else if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer, cinfo); + } + if (e->sc) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + do { + emit_byte(0xFF, cinfo); + emit_byte(0x00, cinfo); + } while (--e->sc); + } + } + /* Output final bytes only if they are not 0x00 */ + if (e->c & 0x7FFF800L) { + if (e->zc) /* output final pending zero bytes */ + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte((e->c >> 19) & 0xFF, cinfo); + if (((e->c >> 19) & 0xFF) == 0xFF) + emit_byte(0x00, cinfo); + if (e->c & 0x7F800L) { + emit_byte((e->c >> 11) & 0xFF, cinfo); + if (((e->c >> 11) & 0xFF) == 0xFF) + emit_byte(0x00, cinfo); + } + } +} + + +/* + * The core arithmetic encoding routine (common in JPEG and JBIG). + * This needs to go as fast as possible. + * Machine-dependent optimization facilities + * are not utilized in this portable implementation. + * However, this code should be fairly efficient and + * may be a good base for further optimizations anyway. + * + * Parameter 'val' to be encoded may be 0 or 1 (binary decision). + * + * Note: I've added full "Pacman" termination support to the + * byte output routines, which is equivalent to the optional + * Discard_final_zeros procedure (Figure D.15) in the spec. + * Thus, we always produce the shortest possible output + * stream compliant to the spec (no trailing zero bytes, + * except for FF stuffing). + * + * I've also introduced a new scheme for accessing + * the probability estimation state machine table, + * derived from Markus Kuhn's JBIG implementation. + */ + +LOCAL(void) +arith_encode (j_compress_ptr cinfo, unsigned char *st, int val) +{ + register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy; + register unsigned char nl, nm; + register INT32 qe, temp; + register int sv; + + /* Fetch values from our compact representation of Table D.2: + * Qe values and probability estimation state machine + */ + sv = *st; + qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */ + nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */ + nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */ + + /* Encode & estimation procedures per sections D.1.4 & D.1.5 */ + e->a -= qe; + if (val != (sv >> 7)) { + /* Encode the less probable symbol */ + if (e->a >= qe) { + /* If the interval size (qe) for the less probable symbol (LPS) + * is larger than the interval size for the MPS, then exchange + * the two symbols for coding efficiency, otherwise code the LPS + * as usual: */ + e->c += e->a; + e->a = qe; + } + *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */ + } else { + /* Encode the more probable symbol */ + if (e->a >= 0x8000L) + return; /* A >= 0x8000 -> ready, no renormalization required */ + if (e->a < qe) { + /* If the interval size (qe) for the less probable symbol (LPS) + * is larger than the interval size for the MPS, then exchange + * the two symbols for coding efficiency: */ + e->c += e->a; + e->a = qe; + } + *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */ + } + + /* Renormalization & data output per section D.1.6 */ + do { + e->a <<= 1; + e->c <<= 1; + if (--e->ct == 0) { + /* Another byte is ready for output */ + temp = e->c >> 19; + if (temp > 0xFF) { + /* Handle overflow over all stacked 0xFF bytes */ + if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer + 1, cinfo); + if (e->buffer + 1 == 0xFF) + emit_byte(0x00, cinfo); + } + e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */ + e->sc = 0; + /* Note: The 3 spacer bits in the C register guarantee + * that the new buffer byte can't be 0xFF here + * (see page 160 in the P&M JPEG book). */ + e->buffer = temp & 0xFF; /* new output byte, might overflow later */ + } else if (temp == 0xFF) { + ++e->sc; /* stack 0xFF byte (which might overflow later) */ + } else { + /* Output all stacked 0xFF bytes, they will not overflow any more */ + if (e->buffer == 0) + ++e->zc; + else if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer, cinfo); + } + if (e->sc) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + do { + emit_byte(0xFF, cinfo); + emit_byte(0x00, cinfo); + } while (--e->sc); + } + e->buffer = temp & 0xFF; /* new output byte (can still overflow) */ + } + e->c &= 0x7FFFFL; + e->ct += 8; + } + } while (e->a < 0x8000L); +} + + +/* + * Emit a restart marker & resynchronize predictions. + */ + +LOCAL(void) +emit_restart (j_compress_ptr cinfo, int restart_num) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci; + jpeg_component_info * compptr; + + finish_pass(cinfo); + + emit_byte(0xFF, cinfo); + emit_byte(JPEG_RST0 + restart_num, cinfo); + + /* Re-initialize statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS); + /* Reset DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + /* AC needs no table when not present */ + if (cinfo->Se) { + MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS); + } + } + + /* Reset arithmetic encoding variables */ + entropy->c = 0; + entropy->a = 0x10000L; + entropy->sc = 0; + entropy->zc = 0; + entropy->ct = 11; + entropy->buffer = -1; /* empty */ +} + + +/* + * 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) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl; + int v, v2, m; + ISHIFT_TEMPS + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + tbl = cinfo->cur_comp_info[ci]->dc_tbl_no; + + /* Compute the DC value after the required point transform by Al. + * This is simply an arithmetic right shift. + */ + m = IRIGHT_SHIFT((int) ((*block)[0]), cinfo->Al); + + /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */ + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.4: Encode_DC_DIFF */ + if ((v = m - entropy->last_dc_val[ci]) == 0) { + arith_encode(cinfo, st, 0); + entropy->dc_context[ci] = 0; /* zero diff category */ + } else { + entropy->last_dc_val[ci] = m; + arith_encode(cinfo, st, 1); + /* Figure F.6: Encoding nonzero value v */ + /* Figure F.7: Encoding the sign of v */ + if (v > 0) { + arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */ + st += 2; /* Table F.4: SP = S0 + 2 */ + entropy->dc_context[ci] = 4; /* small positive diff category */ + } else { + v = -v; + arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */ + st += 3; /* Table F.4: SN = S0 + 3 */ + entropy->dc_context[ci] = 8; /* small negative diff category */ + } + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + arith_encode(cinfo, st, 0); + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] += 8; /* large diff category */ + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + } + + 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) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int tbl, k, ke; + int v, v2, m; + const int * natural_order; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + natural_order = cinfo->natural_order; + + /* Encode the MCU data block */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */ + + /* Establish EOB (end-of-block) index */ + for (ke = cinfo->Se; ke > 0; ke--) + /* 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 ((v = (*block)[natural_order[ke]]) >= 0) { + if (v >>= cinfo->Al) break; + } else { + v = -v; + if (v >>= cinfo->Al) break; + } + + /* Figure F.5: Encode_AC_Coefficients */ + for (k = cinfo->Ss; k <= ke; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 0); /* EOB decision */ + for (;;) { + if ((v = (*block)[natural_order[k]]) >= 0) { + if (v >>= cinfo->Al) { + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 0); + break; + } + } else { + v = -v; + if (v >>= cinfo->Al) { + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 1); + break; + } + } + arith_encode(cinfo, st + 1, 0); st += 3; k++; + } + st += 2; + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + if (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + } + arith_encode(cinfo, st, 0); + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + /* Encode EOB decision only if k <= cinfo->Se */ + if (k <= cinfo->Se) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 1); + } + + return TRUE; +} + + +/* + * MCU encoding for DC successive approximation refinement scan. + */ + +METHODDEF(boolean) +encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + unsigned char *st; + int Al, blkn; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + st = entropy->fixed_bin; /* use fixed probability estimation */ + Al = cinfo->Al; + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + /* We simply emit the Al'th bit of the DC coefficient value. */ + arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1); + } + + return TRUE; +} + + +/* + * MCU encoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int tbl, k, ke, kex; + int v; + const int * natural_order; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + natural_order = cinfo->natural_order; + + /* Encode the MCU data block */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + /* Section G.1.3.3: Encoding of AC coefficients */ + + /* Establish EOB (end-of-block) index */ + for (ke = cinfo->Se; ke > 0; ke--) + /* 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 ((v = (*block)[natural_order[ke]]) >= 0) { + if (v >>= cinfo->Al) break; + } else { + v = -v; + if (v >>= cinfo->Al) break; + } + + /* Establish EOBx (previous stage end-of-block) index */ + for (kex = ke; kex > 0; kex--) + if ((v = (*block)[natural_order[kex]]) >= 0) { + if (v >>= cinfo->Ah) break; + } else { + v = -v; + if (v >>= cinfo->Ah) break; + } + + /* Figure G.10: Encode_AC_Coefficients_SA */ + for (k = cinfo->Ss; k <= ke; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + if (k > kex) + arith_encode(cinfo, st, 0); /* EOB decision */ + for (;;) { + if ((v = (*block)[natural_order[k]]) >= 0) { + if (v >>= cinfo->Al) { + if (v >> 1) /* previously nonzero coef */ + arith_encode(cinfo, st + 2, (v & 1)); + else { /* newly nonzero coef */ + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 0); + } + break; + } + } else { + v = -v; + if (v >>= cinfo->Al) { + if (v >> 1) /* previously nonzero coef */ + arith_encode(cinfo, st + 2, (v & 1)); + else { /* newly nonzero coef */ + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 1); + } + break; + } + } + arith_encode(cinfo, st + 1, 0); st += 3; k++; + } + } + /* Encode EOB decision only if k <= cinfo->Se */ + if (k <= cinfo->Se) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 1); + } + + return TRUE; +} + + +/* + * Encode and output one MCU's worth of arithmetic-compressed coefficients. + */ + +METHODDEF(boolean) +encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + jpeg_component_info * compptr; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl, k, ke; + int v, v2, m; + const int * natural_order; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + natural_order = cinfo->natural_order; + + /* 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]; + + /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */ + + tbl = compptr->dc_tbl_no; + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.4: Encode_DC_DIFF */ + if ((v = (*block)[0] - entropy->last_dc_val[ci]) == 0) { + arith_encode(cinfo, st, 0); + entropy->dc_context[ci] = 0; /* zero diff category */ + } else { + entropy->last_dc_val[ci] = (*block)[0]; + arith_encode(cinfo, st, 1); + /* Figure F.6: Encoding nonzero value v */ + /* Figure F.7: Encoding the sign of v */ + if (v > 0) { + arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */ + st += 2; /* Table F.4: SP = S0 + 2 */ + entropy->dc_context[ci] = 4; /* small positive diff category */ + } else { + v = -v; + arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */ + st += 3; /* Table F.4: SN = S0 + 3 */ + entropy->dc_context[ci] = 8; /* small negative diff category */ + } + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + arith_encode(cinfo, st, 0); + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] += 8; /* large diff category */ + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + + /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */ + + tbl = compptr->ac_tbl_no; + + /* Establish EOB (end-of-block) index */ + for (ke = cinfo->lim_Se; ke > 0; ke--) + if ((*block)[natural_order[ke]]) break; + + /* Figure F.5: Encode_AC_Coefficients */ + for (k = 1; k <= ke; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 0); /* EOB decision */ + while ((v = (*block)[natural_order[k]]) == 0) { + arith_encode(cinfo, st + 1, 0); st += 3; k++; + } + arith_encode(cinfo, st + 1, 1); + /* Figure F.6: Encoding nonzero value v */ + /* Figure F.7: Encoding the sign of v */ + if (v > 0) { + arith_encode(cinfo, entropy->fixed_bin, 0); + } else { + v = -v; + arith_encode(cinfo, entropy->fixed_bin, 1); + } + st += 2; + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + if (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + } + arith_encode(cinfo, st, 0); + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + /* Encode EOB decision only if k <= cinfo->lim_Se */ + if (k <= cinfo->lim_Se) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 1); + } + } + + return TRUE; +} + + +/* + * Initialize for an arithmetic-compressed scan. + */ + +METHODDEF(void) +start_pass (j_compress_ptr cinfo, boolean gather_statistics) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci, tbl; + jpeg_component_info * compptr; + + if (gather_statistics) + /* Make sure to avoid that in the master control logic! + * We are fully adaptive here and need no extra + * statistics gathering pass! + */ + ERREXIT(cinfo, JERR_NOT_COMPILED); + + /* We assume jcmaster.c already validated the progressive scan parameters. */ + + /* Select execution routines */ + if (cinfo->progressive_mode) { + if (cinfo->Ah == 0) { + if (cinfo->Ss == 0) + entropy->pub.encode_mcu = encode_mcu_DC_first; + else + entropy->pub.encode_mcu = encode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + entropy->pub.encode_mcu = encode_mcu_DC_refine; + else + entropy->pub.encode_mcu = encode_mcu_AC_refine; + } + } else + entropy->pub.encode_mcu = encode_mcu; + + /* Allocate & initialize requested statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + tbl = compptr->dc_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->dc_stats[tbl] == NULL) + entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS); + MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS); + /* Initialize DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + /* AC needs no table when not present */ + if (cinfo->Se) { + tbl = compptr->ac_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->ac_stats[tbl] == NULL) + entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS); + MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS); +#ifdef CALCULATE_SPECTRAL_CONDITIONING + if (cinfo->progressive_mode) + /* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */ + cinfo->arith_ac_K[tbl] = cinfo->Ss + ((8 + cinfo->Se - cinfo->Ss) >> 4); +#endif + } + } + + /* Initialize arithmetic encoding variables */ + entropy->c = 0; + entropy->a = 0x10000L; + entropy->sc = 0; + entropy->zc = 0; + entropy->ct = 11; + entropy->buffer = -1; /* empty */ + + /* Initialize restart stuff */ + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num = 0; +} + + +/* + * Module initialization routine for arithmetic entropy encoding. + */ + +GLOBAL(void) +jinit_arith_encoder (j_compress_ptr cinfo) +{ + arith_entropy_ptr entropy; + int i; + + entropy = (arith_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(arith_entropy_encoder)); + cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; + entropy->pub.start_pass = start_pass; + entropy->pub.finish_pass = finish_pass; + + /* Mark tables unallocated */ + for (i = 0; i < NUM_ARITH_TBLS; i++) { + entropy->dc_stats[i] = NULL; + entropy->ac_stats[i] = NULL; + } + + /* Initialize index for fixed probability estimation */ + entropy->fixed_bin[0] = 113; +} diff --git a/jpeg-8c/jcarith.lo b/jpeg-8c/jcarith.lo new file mode 100644 index 00000000..450a0b64 --- /dev/null +++ b/jpeg-8c/jcarith.lo @@ -0,0 +1,12 @@ +# jcarith.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jcarith.o' + +# Name of the non-PIC object +non_pic_object='jcarith.o' + diff --git a/jpeg-8c/jccoefct.c b/jpeg-8c/jccoefct.c new file mode 100644 index 00000000..d775313b --- /dev/null +++ b/jpeg-8c/jccoefct.c @@ -0,0 +1,453 @@ +/* + * 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; + forward_DCT_ptr forward_DCT; + + /* 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]; + forward_DCT = cinfo->fdct->forward_DCT[compptr->component_index]; + blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width + : compptr->last_col_width; + xpos = MCU_col_num * compptr->MCU_sample_width; + ypos = yoffset * compptr->DCT_v_scaled_size; + /* 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) { + (*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 += compptr->DCT_v_scaled_size; + } + } + /* 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; + forward_DCT_ptr forward_DCT; + + 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; + forward_DCT = cinfo->fdct->forward_DCT[ci]; + /* 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]; + (*forward_DCT) (cinfo, compptr, input_buf[ci], thisblockrow, + (JDIMENSION) (block_row * compptr->DCT_v_scaled_size), + (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/jpeg-8c/jccoefct.lo b/jpeg-8c/jccoefct.lo new file mode 100644 index 00000000..ff22fa19 --- /dev/null +++ b/jpeg-8c/jccoefct.lo @@ -0,0 +1,12 @@ +# jccoefct.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jccoefct.o' + +# Name of the non-PIC object +non_pic_object='jccoefct.o' + diff --git a/jpeg-8c/jccolor.c b/jpeg-8c/jccolor.c new file mode 100644 index 00000000..0a8a4b5d --- /dev/null +++ b/jpeg-8c/jccolor.c @@ -0,0 +1,459 @@ +/* + * 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/jpeg-8c/jccolor.lo b/jpeg-8c/jccolor.lo new file mode 100644 index 00000000..fb9cb417 --- /dev/null +++ b/jpeg-8c/jccolor.lo @@ -0,0 +1,12 @@ +# jccolor.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jccolor.o' + +# Name of the non-PIC object +non_pic_object='jccolor.o' + diff --git a/jpeg-8c/jcdctmgr.c b/jpeg-8c/jcdctmgr.c new file mode 100644 index 00000000..0bbdbb68 --- /dev/null +++ b/jpeg-8c/jcdctmgr.c @@ -0,0 +1,482 @@ +/* + * 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[MAX_COMPONENTS]; + + /* 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[MAX_COMPONENTS]; + FAST_FLOAT * float_divisors[NUM_QUANT_TBLS]; +#endif +} my_fdct_controller; + +typedef my_fdct_controller * my_fdct_ptr; + + +/* The current scaled-DCT routines require ISLOW-style divisor 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 DCT_SCALING_SUPPORTED +#define PROVIDE_ISLOW_TABLES +#endif +#endif + + +/* + * 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[compptr->component_index]; + 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 += compptr->DCT_h_scaled_size) { + /* Perform the DCT */ + (*do_dct) (workspace, sample_data, start_col); + + /* 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[compptr->component_index]; + 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 += compptr->DCT_h_scaled_size) { + /* Perform the DCT */ + (*do_dct) (workspace, sample_data, start_col); + + /* 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 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; + int method = 0; + JQUANT_TBL * qtbl; + DCTELEM * dtbl; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Select the proper DCT routine for this component's scaling */ + switch ((compptr->DCT_h_scaled_size << 8) + compptr->DCT_v_scaled_size) { +#ifdef DCT_SCALING_SUPPORTED + case ((1 << 8) + 1): + fdct->do_dct[ci] = jpeg_fdct_1x1; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((2 << 8) + 2): + fdct->do_dct[ci] = jpeg_fdct_2x2; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((3 << 8) + 3): + fdct->do_dct[ci] = jpeg_fdct_3x3; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((4 << 8) + 4): + fdct->do_dct[ci] = jpeg_fdct_4x4; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((5 << 8) + 5): + fdct->do_dct[ci] = jpeg_fdct_5x5; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((6 << 8) + 6): + fdct->do_dct[ci] = jpeg_fdct_6x6; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((7 << 8) + 7): + fdct->do_dct[ci] = jpeg_fdct_7x7; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((9 << 8) + 9): + fdct->do_dct[ci] = jpeg_fdct_9x9; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((10 << 8) + 10): + fdct->do_dct[ci] = jpeg_fdct_10x10; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((11 << 8) + 11): + fdct->do_dct[ci] = jpeg_fdct_11x11; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((12 << 8) + 12): + fdct->do_dct[ci] = jpeg_fdct_12x12; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((13 << 8) + 13): + fdct->do_dct[ci] = jpeg_fdct_13x13; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((14 << 8) + 14): + fdct->do_dct[ci] = jpeg_fdct_14x14; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((15 << 8) + 15): + fdct->do_dct[ci] = jpeg_fdct_15x15; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((16 << 8) + 16): + fdct->do_dct[ci] = jpeg_fdct_16x16; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((16 << 8) + 8): + fdct->do_dct[ci] = jpeg_fdct_16x8; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((14 << 8) + 7): + fdct->do_dct[ci] = jpeg_fdct_14x7; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((12 << 8) + 6): + fdct->do_dct[ci] = jpeg_fdct_12x6; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((10 << 8) + 5): + fdct->do_dct[ci] = jpeg_fdct_10x5; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((8 << 8) + 4): + fdct->do_dct[ci] = jpeg_fdct_8x4; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((6 << 8) + 3): + fdct->do_dct[ci] = jpeg_fdct_6x3; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((4 << 8) + 2): + fdct->do_dct[ci] = jpeg_fdct_4x2; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((2 << 8) + 1): + fdct->do_dct[ci] = jpeg_fdct_2x1; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((8 << 8) + 16): + fdct->do_dct[ci] = jpeg_fdct_8x16; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((7 << 8) + 14): + fdct->do_dct[ci] = jpeg_fdct_7x14; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((6 << 8) + 12): + fdct->do_dct[ci] = jpeg_fdct_6x12; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((5 << 8) + 10): + fdct->do_dct[ci] = jpeg_fdct_5x10; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((4 << 8) + 8): + fdct->do_dct[ci] = jpeg_fdct_4x8; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((3 << 8) + 6): + fdct->do_dct[ci] = jpeg_fdct_3x6; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((2 << 8) + 4): + fdct->do_dct[ci] = jpeg_fdct_2x4; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((1 << 8) + 2): + fdct->do_dct[ci] = jpeg_fdct_1x2; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; +#endif + case ((DCTSIZE << 8) + DCTSIZE): + switch (cinfo->dct_method) { +#ifdef DCT_ISLOW_SUPPORTED + case JDCT_ISLOW: + fdct->do_dct[ci] = jpeg_fdct_islow; + method = JDCT_ISLOW; + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + fdct->do_dct[ci] = jpeg_fdct_ifast; + method = JDCT_IFAST; + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + fdct->do_float_dct[ci] = jpeg_fdct_float; + method = JDCT_FLOAT; + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + break; + default: + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, + compptr->DCT_h_scaled_size, compptr->DCT_v_scaled_size); + break; + } + 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 (method) { +#ifdef PROVIDE_ISLOW_TABLES + 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; + } + fdct->pub.forward_DCT[ci] = forward_DCT; + 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); + } + } + fdct->pub.forward_DCT[ci] = forward_DCT; + 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++; + } + } + } + fdct->pub.forward_DCT[ci] = forward_DCT_float; + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + } +} + + +/* + * 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; + + /* 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/jpeg-8c/jcdctmgr.lo b/jpeg-8c/jcdctmgr.lo new file mode 100644 index 00000000..cb15e8b3 --- /dev/null +++ b/jpeg-8c/jcdctmgr.lo @@ -0,0 +1,12 @@ +# jcdctmgr.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jcdctmgr.o' + +# Name of the non-PIC object +non_pic_object='jcdctmgr.o' + diff --git a/jpeg-8c/jchuff.c b/jpeg-8c/jchuff.c new file mode 100644 index 00000000..257d7aa1 --- /dev/null +++ b/jpeg-8c/jchuff.c @@ -0,0 +1,1576 @@ +/* + * jchuff.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2006-2009 by Guido Vollbeding. + * 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. + * Both sequential and progressive modes are supported in this single module. + * + * 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. + * + * We do not support output suspension for the progressive JPEG mode, 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" + + +/* 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; + + +/* 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]; + + /* Statistics tables for optimization */ + long * dc_count_ptrs[NUM_HUFF_TBLS]; + long * ac_count_ptrs[NUM_HUFF_TBLS]; + + /* Following fields used only in progressive mode */ + + /* Mode flag: TRUE for optimization, FALSE for actual data output */ + boolean gather_statistics; + + /* 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 */ + j_compress_ptr cinfo; /* link to cinfo (needed for dump_buffer) */ + + /* 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... */ +} huff_entropy_encoder; + +typedef huff_entropy_encoder * huff_entropy_ptr; + +/* Working state while writing an MCU (sequential mode). + * 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; + +/* 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 + + +/* + * Compute the derived values for a Huffman table. + * This routine also performs some validation checks on the table. + */ + +LOCAL(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. + * NB: these must be called only when actually outputting, + * that is, entropy->gather_statistics == FALSE. + */ + +/* Emit a byte, taking 'action' if must suspend. */ +#define emit_byte_s(state,val,action) \ + { *(state)->next_output_byte++ = (JOCTET) (val); \ + if (--(state)->free_in_buffer == 0) \ + if (! dump_buffer_s(state)) \ + { action; } } + +/* Emit a byte */ +#define emit_byte_e(entropy,val) \ + { *(entropy)->next_output_byte++ = (JOCTET) (val); \ + if (--(entropy)->free_in_buffer == 0) \ + dump_buffer_e(entropy); } + + +LOCAL(boolean) +dump_buffer_s (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; +} + + +LOCAL(void) +dump_buffer_e (huff_entropy_ptr entropy) +/* Empty the output buffer; we do not support suspension in this case. */ +{ + 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(boolean) +emit_bits_s (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_s(state, c, return FALSE); + if (c == 0xFF) { /* need to stuff a zero byte? */ + emit_byte_s(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; +} + + +INLINE +LOCAL(void) +emit_bits_e (huff_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->saved.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)<saved.put_buffer; + + while (put_bits >= 8) { + int c = (int) ((put_buffer >> 16) & 0xFF); + + emit_byte_e(entropy, c); + if (c == 0xFF) { /* need to stuff a zero byte? */ + emit_byte_e(entropy, 0); + } + put_buffer <<= 8; + put_bits -= 8; + } + + entropy->saved.put_buffer = put_buffer; /* update variables */ + entropy->saved.put_bits = put_bits; +} + + +LOCAL(boolean) +flush_bits_s (working_state * state) +{ + if (! emit_bits_s(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; +} + + +LOCAL(void) +flush_bits_e (huff_entropy_ptr entropy) +{ + emit_bits_e(entropy, 0x7F, 7); /* fill any partial byte with ones */ + entropy->saved.put_buffer = 0; /* and reset bit-buffer to empty */ + entropy->saved.put_bits = 0; +} + + +/* + * Emit (or just count) a Huffman symbol. + */ + +INLINE +LOCAL(void) +emit_dc_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol) +{ + if (entropy->gather_statistics) + entropy->dc_count_ptrs[tbl_no][symbol]++; + else { + c_derived_tbl * tbl = entropy->dc_derived_tbls[tbl_no]; + emit_bits_e(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]); + } +} + + +INLINE +LOCAL(void) +emit_ac_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol) +{ + if (entropy->gather_statistics) + entropy->ac_count_ptrs[tbl_no][symbol]++; + else { + c_derived_tbl * tbl = entropy->ac_derived_tbls[tbl_no]; + emit_bits_e(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]); + } +} + + +/* + * Emit bits from a correction bit buffer. + */ + +LOCAL(void) +emit_buffered_bits (huff_entropy_ptr entropy, char * bufstart, + unsigned int nbits) +{ + if (entropy->gather_statistics) + return; /* no real work */ + + while (nbits > 0) { + emit_bits_e(entropy, (unsigned int) (*bufstart), 1); + bufstart++; + nbits--; + } +} + + +/* + * Emit any pending EOBRUN symbol. + */ + +LOCAL(void) +emit_eobrun (huff_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_ac_symbol(entropy, entropy->ac_tbl_no, nbits << 4); + if (nbits) + emit_bits_e(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(boolean) +emit_restart_s (working_state * state, int restart_num) +{ + int ci; + + if (! flush_bits_s(state)) + return FALSE; + + emit_byte_s(state, 0xFF, return FALSE); + emit_byte_s(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; +} + + +LOCAL(void) +emit_restart_e (huff_entropy_ptr entropy, int restart_num) +{ + int ci; + + emit_eobrun(entropy); + + if (! entropy->gather_statistics) { + flush_bits_e(entropy); + emit_byte_e(entropy, 0xFF); + emit_byte_e(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->saved.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) +{ + huff_entropy_ptr entropy = (huff_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_e(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->saved.last_dc_val[ci]; + entropy->saved.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_dc_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_e(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) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int temp, temp2; + register int nbits; + register int r, k; + int Se, Al; + const int * natural_order; + 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_e(entropy, entropy->next_restart_num); + + Se = cinfo->Se; + Al = cinfo->Al; + natural_order = cinfo->natural_order; + + /* 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)[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_ac_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_ac_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_e(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) +{ + huff_entropy_ptr entropy = (huff_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_e(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_e(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) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int temp; + register int r, k; + int EOB; + char *BR_buffer; + unsigned int BR; + int Se, Al; + const int * natural_order; + 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_e(entropy, entropy->next_restart_num); + + Se = cinfo->Se; + Al = cinfo->Al; + natural_order = cinfo->natural_order; + + /* 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)[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_ac_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_ac_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1); + + /* Emit output bit for newly-nonzero coef */ + temp = ((*block)[natural_order[k]] < 0) ? 0 : 1; + emit_bits_e(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; +} + + +/* 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; + int Se = state->cinfo->lim_Se; + const int * natural_order = state->cinfo->natural_order; + + /* 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_s(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_s(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 <= Se; k++) { + if ((temp = block[natural_order[k]]) == 0) { + r++; + } else { + /* if run length > 15, must emit special run-length-16 codes (0xF0) */ + while (r > 15) { + if (! emit_bits_s(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_s(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_s(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_s(state, actbl->ehufco[0], actbl->ehufsi[0])) + return FALSE; + + 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_s(&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; + + if (cinfo->progressive_mode) { + 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_e(entropy); + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + } else { + /* 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_s(&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. + */ + + +/* 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; + int Se = cinfo->lim_Se; + const int * natural_order = cinfo->natural_order; + + /* 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 <= Se; k++) { + if ((temp = block[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. + * + * 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. + */ + +LOCAL(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, tbl; + 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! + */ + if (cinfo->progressive_mode) + /* Flush out buffered data (all we care about is counting the EOB symbol) */ + emit_eobrun(entropy); + + 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]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + tbl = compptr->dc_tbl_no; + if (! did_dc[tbl]) { + htblptr = & cinfo->dc_huff_tbl_ptrs[tbl]; + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[tbl]); + did_dc[tbl] = TRUE; + } + } + /* AC needs no table when not present */ + if (cinfo->Se) { + tbl = compptr->ac_tbl_no; + if (! did_ac[tbl]) { + 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->ac_count_ptrs[tbl]); + did_ac[tbl] = TRUE; + } + } + } +} + + +/* + * 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, tbl; + jpeg_component_info * compptr; + + if (gather_statistics) + entropy->pub.finish_pass = finish_pass_gather; + else + entropy->pub.finish_pass = finish_pass_huff; + + if (cinfo->progressive_mode) { + entropy->cinfo = cinfo; + entropy->gather_statistics = gather_statistics; + + /* We assume jcmaster.c already validated the scan parameters. */ + + /* Select execution routine */ + if (cinfo->Ah == 0) { + if (cinfo->Ss == 0) + entropy->pub.encode_mcu = encode_mcu_DC_first; + else + entropy->pub.encode_mcu = encode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + 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)); + } + } + + /* Initialize AC stuff */ + entropy->ac_tbl_no = cinfo->cur_comp_info[0]->ac_tbl_no; + entropy->EOBRUN = 0; + entropy->BE = 0; + } else { + if (gather_statistics) + entropy->pub.encode_mcu = encode_mcu_gather; + else + entropy->pub.encode_mcu = encode_mcu_huff; + } + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + tbl = compptr->dc_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->dc_count_ptrs[tbl] == NULL) + entropy->dc_count_ptrs[tbl] = (long *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + 257 * SIZEOF(long)); + MEMZERO(entropy->dc_count_ptrs[tbl], 257 * SIZEOF(long)); + } 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, tbl, + & entropy->dc_derived_tbls[tbl]); + } + /* Initialize DC predictions to 0 */ + entropy->saved.last_dc_val[ci] = 0; + } + /* AC needs no table when not present */ + if (cinfo->Se) { + tbl = compptr->ac_tbl_no; + if (gather_statistics) { + if (tbl < 0 || tbl >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl); + if (entropy->ac_count_ptrs[tbl] == NULL) + entropy->ac_count_ptrs[tbl] = (long *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + 257 * SIZEOF(long)); + MEMZERO(entropy->ac_count_ptrs[tbl], 257 * SIZEOF(long)); + } else { + jpeg_make_c_derived_tbl(cinfo, FALSE, tbl, + & entropy->ac_derived_tbls[tbl]); + } + } + } + + /* 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; +} + + +/* + * 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; + entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL; + } + + if (cinfo->progressive_mode) + entropy->bit_buffer = NULL; /* needed only in AC refinement scan */ +} diff --git a/jpeg-8c/jchuff.lo b/jpeg-8c/jchuff.lo new file mode 100644 index 00000000..60e2ed92 --- /dev/null +++ b/jpeg-8c/jchuff.lo @@ -0,0 +1,12 @@ +# jchuff.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jchuff.o' + +# Name of the non-PIC object +non_pic_object='jchuff.o' + diff --git a/jpeg-8c/jcinit.c b/jpeg-8c/jcinit.c new file mode 100644 index 00000000..0ba310f2 --- /dev/null +++ b/jpeg-8c/jcinit.c @@ -0,0 +1,65 @@ +/* + * 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) + jinit_arith_encoder(cinfo); + 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/jpeg-8c/jcinit.lo b/jpeg-8c/jcinit.lo new file mode 100644 index 00000000..564625b0 --- /dev/null +++ b/jpeg-8c/jcinit.lo @@ -0,0 +1,12 @@ +# jcinit.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jcinit.o' + +# Name of the non-PIC object +non_pic_object='jcinit.o' + diff --git a/jpeg-8c/jcmainct.c b/jpeg-8c/jcmainct.c new file mode 100644 index 00000000..7de75d16 --- /dev/null +++ b/jpeg-8c/jcmainct.c @@ -0,0 +1,293 @@ +/* + * 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 < (JDIMENSION) cinfo->min_DCT_v_scaled_size) + (*cinfo->prep->pre_process_data) (cinfo, + input_buf, in_row_ctr, in_rows_avail, + main->buffer, &main->rowgroup_ctr, + (JDIMENSION) cinfo->min_DCT_v_scaled_size); + + /* 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 != (JDIMENSION) cinfo->min_DCT_v_scaled_size) + 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 * compptr->DCT_h_scaled_size, + (JDIMENSION) jround_up((long) compptr->height_in_blocks, + (long) compptr->v_samp_factor) * DCTSIZE, + (JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size)); + } +#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 * compptr->DCT_h_scaled_size, + (JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size)); + } + } +} diff --git a/jpeg-8c/jcmainct.lo b/jpeg-8c/jcmainct.lo new file mode 100644 index 00000000..d476e477 --- /dev/null +++ b/jpeg-8c/jcmainct.lo @@ -0,0 +1,12 @@ +# jcmainct.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jcmainct.o' + +# Name of the non-PIC object +non_pic_object='jcmainct.o' + diff --git a/jpeg-8c/jcmarker.c b/jpeg-8c/jcmarker.c new file mode 100644 index 00000000..606c19af --- /dev/null +++ b/jpeg-8c/jcmarker.c @@ -0,0 +1,682 @@ +/* + * jcmarker.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2003-2010 by Guido Vollbeding. + * 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 <= cinfo->lim_Se; i++) { + if (qtbl->quantval[cinfo->natural_order[i]] > 255) + prec = 1; + } + + if (! qtbl->sent_table) { + emit_marker(cinfo, M_DQT); + + emit_2bytes(cinfo, + prec ? cinfo->lim_Se * 2 + 2 + 1 + 2 : cinfo->lim_Se + 1 + 1 + 2); + + emit_byte(cinfo, index + (prec<<4)); + + for (i = 0; i <= cinfo->lim_Se; i++) { + /* The table entries must be emitted in zigzag order. */ + unsigned int qval = qtbl->quantval[cinfo->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 needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) + dc_in_use[compptr->dc_tbl_no] = 1; + /* AC needs no table when not present */ + if (cinfo->Se) + 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]; + + if (length) { + 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->jpeg_height > 65535L || + (long) cinfo->jpeg_width > 65535L) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535); + + emit_byte(cinfo, cinfo->data_precision); + emit_2bytes(cinfo, (int) cinfo->jpeg_height); + emit_2bytes(cinfo, (int) cinfo->jpeg_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); + + /* 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. + */ + + /* DC needs no table for refinement scan */ + td = cinfo->Ss == 0 && cinfo->Ah == 0 ? compptr->dc_tbl_no : 0; + /* AC needs no table when not present */ + ta = cinfo->Se ? compptr->ac_tbl_no : 0; + + 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_pseudo_sos (j_compress_ptr cinfo) +/* Emit a pseudo SOS marker */ +{ + emit_marker(cinfo, M_SOS); + + emit_2bytes(cinfo, 2 + 1 + 3); /* length */ + + emit_byte(cinfo, 0); /* Ns */ + + emit_byte(cinfo, 0); /* Ss */ + emit_byte(cinfo, cinfo->block_size * cinfo->block_size - 1); /* Se */ + emit_byte(cinfo, 0); /* Ah/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, and a conditional pseudo SOS marker. + * 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 || cinfo->block_size != DCTSIZE) { + 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) { + if (cinfo->progressive_mode) + emit_sof(cinfo, M_SOF10); /* SOF code for progressive arithmetic */ + else + emit_sof(cinfo, M_SOF9); /* SOF code for sequential arithmetic */ + } 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 */ + } + + /* Check to emit pseudo SOS marker */ + if (cinfo->progressive_mode && cinfo->block_size != DCTSIZE) + emit_pseudo_sos(cinfo); +} + + +/* + * 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]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) + emit_dht(cinfo, compptr->dc_tbl_no, FALSE); + /* AC needs no table when not present */ + if (cinfo->Se) + 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/jpeg-8c/jcmarker.lo b/jpeg-8c/jcmarker.lo new file mode 100644 index 00000000..f29d3d35 --- /dev/null +++ b/jpeg-8c/jcmarker.lo @@ -0,0 +1,12 @@ +# jcmarker.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jcmarker.o' + +# Name of the non-PIC object +non_pic_object='jcmarker.o' + diff --git a/jpeg-8c/jcmaster.c b/jpeg-8c/jcmaster.c new file mode 100644 index 00000000..caf80a53 --- /dev/null +++ b/jpeg-8c/jcmaster.c @@ -0,0 +1,858 @@ +/* + * jcmaster.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2003-2011 by Guido Vollbeding. + * 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. + */ + +/* + * Compute JPEG 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. + */ + +GLOBAL(void) +jpeg_calc_jpeg_dimensions (j_compress_ptr cinfo) +/* Do computations that are needed before master selection phase */ +{ +#ifdef DCT_SCALING_SUPPORTED + + /* Sanity check on input image dimensions to prevent overflow in + * following calculation. + * We do check jpeg_width and jpeg_height in initial_setup below, + * but image_width and image_height can come from arbitrary data, + * and we need some space for multiplication by block_size. + */ + if (((long) cinfo->image_width >> 24) || ((long) cinfo->image_height >> 24)) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); + + /* Compute actual JPEG image dimensions and DCT scaling choices. */ + if (cinfo->scale_num >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/1 scaling */ + cinfo->jpeg_width = cinfo->image_width * cinfo->block_size; + cinfo->jpeg_height = cinfo->image_height * cinfo->block_size; + cinfo->min_DCT_h_scaled_size = 1; + cinfo->min_DCT_v_scaled_size = 1; + } else if (cinfo->scale_num * 2 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/2 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 2L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 2L); + cinfo->min_DCT_h_scaled_size = 2; + cinfo->min_DCT_v_scaled_size = 2; + } else if (cinfo->scale_num * 3 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/3 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 3L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 3L); + cinfo->min_DCT_h_scaled_size = 3; + cinfo->min_DCT_v_scaled_size = 3; + } else if (cinfo->scale_num * 4 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/4 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 4L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 4L); + cinfo->min_DCT_h_scaled_size = 4; + cinfo->min_DCT_v_scaled_size = 4; + } else if (cinfo->scale_num * 5 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/5 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 5L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 5L); + cinfo->min_DCT_h_scaled_size = 5; + cinfo->min_DCT_v_scaled_size = 5; + } else if (cinfo->scale_num * 6 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/6 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 6L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 6L); + cinfo->min_DCT_h_scaled_size = 6; + cinfo->min_DCT_v_scaled_size = 6; + } else if (cinfo->scale_num * 7 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/7 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 7L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 7L); + cinfo->min_DCT_h_scaled_size = 7; + cinfo->min_DCT_v_scaled_size = 7; + } else if (cinfo->scale_num * 8 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/8 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 8L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 8L); + cinfo->min_DCT_h_scaled_size = 8; + cinfo->min_DCT_v_scaled_size = 8; + } else if (cinfo->scale_num * 9 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/9 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 9L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 9L); + cinfo->min_DCT_h_scaled_size = 9; + cinfo->min_DCT_v_scaled_size = 9; + } else if (cinfo->scale_num * 10 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/10 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 10L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 10L); + cinfo->min_DCT_h_scaled_size = 10; + cinfo->min_DCT_v_scaled_size = 10; + } else if (cinfo->scale_num * 11 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/11 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 11L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 11L); + cinfo->min_DCT_h_scaled_size = 11; + cinfo->min_DCT_v_scaled_size = 11; + } else if (cinfo->scale_num * 12 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/12 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 12L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 12L); + cinfo->min_DCT_h_scaled_size = 12; + cinfo->min_DCT_v_scaled_size = 12; + } else if (cinfo->scale_num * 13 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/13 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 13L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 13L); + cinfo->min_DCT_h_scaled_size = 13; + cinfo->min_DCT_v_scaled_size = 13; + } else if (cinfo->scale_num * 14 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/14 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 14L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 14L); + cinfo->min_DCT_h_scaled_size = 14; + cinfo->min_DCT_v_scaled_size = 14; + } else if (cinfo->scale_num * 15 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/15 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 15L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 15L); + cinfo->min_DCT_h_scaled_size = 15; + cinfo->min_DCT_v_scaled_size = 15; + } else { + /* Provide block_size/16 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 16L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 16L); + cinfo->min_DCT_h_scaled_size = 16; + cinfo->min_DCT_v_scaled_size = 16; + } + +#else /* !DCT_SCALING_SUPPORTED */ + + /* Hardwire it to "no scaling" */ + cinfo->jpeg_width = cinfo->image_width; + cinfo->jpeg_height = cinfo->image_height; + cinfo->min_DCT_h_scaled_size = DCTSIZE; + cinfo->min_DCT_v_scaled_size = DCTSIZE; + +#endif /* DCT_SCALING_SUPPORTED */ +} + + +LOCAL(void) +jpeg_calc_trans_dimensions (j_compress_ptr cinfo) +{ + if (cinfo->min_DCT_h_scaled_size != cinfo->min_DCT_v_scaled_size) + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, + cinfo->min_DCT_h_scaled_size, cinfo->min_DCT_v_scaled_size); + + cinfo->block_size = cinfo->min_DCT_h_scaled_size; +} + + +LOCAL(void) +initial_setup (j_compress_ptr cinfo, boolean transcode_only) +/* Do computations that are needed before master selection phase */ +{ + int ci, ssize; + jpeg_component_info *compptr; + long samplesperrow; + JDIMENSION jd_samplesperrow; + + if (transcode_only) + jpeg_calc_trans_dimensions(cinfo); + else + jpeg_calc_jpeg_dimensions(cinfo); + + /* Sanity check on block_size */ + if (cinfo->block_size < 1 || cinfo->block_size > 16) + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, cinfo->block_size, cinfo->block_size); + + /* Derive natural_order from block_size */ + switch (cinfo->block_size) { + case 2: cinfo->natural_order = jpeg_natural_order2; break; + case 3: cinfo->natural_order = jpeg_natural_order3; break; + case 4: cinfo->natural_order = jpeg_natural_order4; break; + case 5: cinfo->natural_order = jpeg_natural_order5; break; + case 6: cinfo->natural_order = jpeg_natural_order6; break; + case 7: cinfo->natural_order = jpeg_natural_order7; break; + default: cinfo->natural_order = jpeg_natural_order; break; + } + + /* Derive lim_Se from block_size */ + cinfo->lim_Se = cinfo->block_size < DCTSIZE ? + cinfo->block_size * cinfo->block_size - 1 : DCTSIZE2-1; + + /* Sanity check on image dimensions */ + if (cinfo->jpeg_height <= 0 || cinfo->jpeg_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->jpeg_height > (long) JPEG_MAX_DIMENSION || + (long) cinfo->jpeg_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; + /* In selecting the actual DCT scaling for each component, we try to + * scale down the chroma components via DCT scaling rather than downsampling. + * This saves time if the downsampler gets to use 1:1 scaling. + * Note this code adapts subsampling ratios which are powers of 2. + */ + ssize = 1; +#ifdef DCT_SCALING_SUPPORTED + while (cinfo->min_DCT_h_scaled_size * ssize <= + (cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) { + ssize = ssize * 2; + } +#endif + compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize; + ssize = 1; +#ifdef DCT_SCALING_SUPPORTED + while (cinfo->min_DCT_v_scaled_size * ssize <= + (cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) { + ssize = ssize * 2; + } +#endif + compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize; + + /* We don't support DCT ratios larger than 2. */ + if (compptr->DCT_h_scaled_size > compptr->DCT_v_scaled_size * 2) + compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2; + else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2) + compptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2; + + /* Size in DCT blocks */ + compptr->width_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_width * (long) compptr->h_samp_factor, + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + compptr->height_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_height * (long) compptr->v_samp_factor, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + /* Size in samples */ + compptr->downsampled_width = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_width * + (long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size), + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + compptr->downsampled_height = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_height * + (long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size), + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + /* 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->jpeg_height, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); +} + + +#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); + } + } +} + + +LOCAL(void) +reduce_script (j_compress_ptr cinfo) +/* Adapt scan script for use with reduced block size; + * assume that script has been validated before. + */ +{ + jpeg_scan_info * scanptr; + int idxout, idxin; + + /* Circumvent const declaration for this function */ + scanptr = (jpeg_scan_info *) cinfo->scan_info; + idxout = 0; + + for (idxin = 0; idxin < cinfo->num_scans; idxin++) { + /* After skipping, idxout becomes smaller than idxin */ + if (idxin != idxout) + /* Copy rest of data; + * note we stay in given chunk of allocated memory. + */ + scanptr[idxout] = scanptr[idxin]; + if (scanptr[idxout].Ss > cinfo->lim_Se) + /* Entire scan out of range - skip this entry */ + continue; + if (scanptr[idxout].Se > cinfo->lim_Se) + /* Limit scan to end of block */ + scanptr[idxout].Se = cinfo->lim_Se; + idxout++; + } + + cinfo->num_scans = idxout; +} + +#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]]; + } + if (cinfo->progressive_mode) { + cinfo->Ss = scanptr->Ss; + cinfo->Se = scanptr->Se; + cinfo->Ah = scanptr->Ah; + cinfo->Al = scanptr->Al; + return; + } + } + 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 = cinfo->block_size * cinfo->block_size - 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 = compptr->DCT_h_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->jpeg_width, + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + cinfo->MCU_rows_in_scan = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_height, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + + 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_h_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 > 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->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, transcode_only); + + if (cinfo->scan_info != NULL) { +#ifdef C_MULTISCAN_FILES_SUPPORTED + validate_script(cinfo); + if (cinfo->block_size < DCTSIZE) + reduce_script(cinfo); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + cinfo->progressive_mode = FALSE; + cinfo->num_scans = 1; + } + + if ((cinfo->progressive_mode || cinfo->block_size < DCTSIZE) && + !cinfo->arith_code) /* TEMPORARY HACK ??? */ + /* assume default tables no good for progressive or downscale mode */ + cinfo->optimize_coding = TRUE; + + /* 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/jpeg-8c/jcmaster.lo b/jpeg-8c/jcmaster.lo new file mode 100644 index 00000000..747da1d8 --- /dev/null +++ b/jpeg-8c/jcmaster.lo @@ -0,0 +1,12 @@ +# jcmaster.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jcmaster.o' + +# Name of the non-PIC object +non_pic_object='jcmaster.o' + diff --git a/jpeg-8c/jcomapi.c b/jpeg-8c/jcomapi.c new file mode 100644 index 00000000..9b1fa756 --- /dev/null +++ b/jpeg-8c/jcomapi.c @@ -0,0 +1,106 @@ +/* + * 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/jpeg-8c/jcomapi.lo b/jpeg-8c/jcomapi.lo new file mode 100644 index 00000000..9f01f116 --- /dev/null +++ b/jpeg-8c/jcomapi.lo @@ -0,0 +1,12 @@ +# jcomapi.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jcomapi.o' + +# Name of the non-PIC object +non_pic_object='jcomapi.o' + diff --git a/jpeg-8c/jconfig.bcc b/jpeg-8c/jconfig.bcc new file mode 100644 index 00000000..e4da3d72 --- /dev/null +++ b/jpeg-8c/jconfig.bcc @@ -0,0 +1,48 @@ +/* jconfig.bcc --- jconfig.h for Borland C (Turbo C) on MS-DOS or OS/2. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#ifdef __MSDOS__ +#define NEED_FAR_POINTERS /* for small or medium memory model */ +#endif +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN /* this assumes you have -w-stu in CFLAGS */ + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#ifdef __MSDOS__ +#define USE_MSDOS_MEMMGR /* Define this if you use jmemdos.c */ +#define MAX_ALLOC_CHUNK 65520L /* Maximum request to malloc() */ +#define USE_FMEM /* Borland has _fmemcpy() and _fmemset() */ +#endif + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE +#define USE_SETMODE /* Borland has setmode() */ +#ifdef __MSDOS__ +#define NEED_SIGNAL_CATCHER /* Define this if you use jmemdos.c */ +#endif +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/jpeg-8c/jconfig.cfg b/jpeg-8c/jconfig.cfg new file mode 100644 index 00000000..bb7435c9 --- /dev/null +++ b/jpeg-8c/jconfig.cfg @@ -0,0 +1,53 @@ +/* jconfig.cfg --- source file edited by configure script */ +/* see jconfig.txt for explanations */ + +#undef HAVE_PROTOTYPES +#undef HAVE_UNSIGNED_CHAR +#undef HAVE_UNSIGNED_SHORT +#undef void +#undef const +#undef CHAR_IS_UNSIGNED +#undef HAVE_STDDEF_H +#undef HAVE_STDLIB_H +#undef HAVE_LOCALE_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +/* Define this if you get warnings about undefined structures. */ +#undef INCOMPLETE_TYPES_BROKEN + +/* Define "boolean" as unsigned char, not int, on Windows systems. */ +#ifdef _WIN32 +#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ +typedef unsigned char boolean; +#endif +#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ +#endif + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED +#undef INLINE +/* These are for configuring the JPEG memory manager. */ +#undef DEFAULT_MAX_MEM +#undef NO_MKTEMP + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#undef TWO_FILE_COMMANDLINE +#undef NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE + +/* Define this if you want percent-done progress reports from cjpeg/djpeg. */ +#undef PROGRESS_REPORT + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/jpeg-8c/jconfig.dj b/jpeg-8c/jconfig.dj new file mode 100644 index 00000000..a0d4092f --- /dev/null +++ b/jpeg-8c/jconfig.dj @@ -0,0 +1,38 @@ +/* jconfig.dj --- jconfig.h for DJGPP (Delorie's GNU C port) on MS-DOS. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS /* DJGPP uses flat 32-bit addressing */ +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#undef TWO_FILE_COMMANDLINE /* optional */ +#define USE_SETMODE /* Needed to make one-file style work in DJGPP */ +#undef NEED_SIGNAL_CATCHER /* Define this if you use jmemname.c */ +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/jpeg-8c/jconfig.h b/jpeg-8c/jconfig.h new file mode 100644 index 00000000..966b1d51 --- /dev/null +++ b/jpeg-8c/jconfig.h @@ -0,0 +1,54 @@ +/* jconfig.h. Generated from jconfig.cfg by configure. */ +/* jconfig.cfg --- source file edited by configure script */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES 1 +#define HAVE_UNSIGNED_CHAR 1 +#define HAVE_UNSIGNED_SHORT 1 +/* #undef void */ +/* #undef const */ +/* #undef CHAR_IS_UNSIGNED */ +#define HAVE_STDDEF_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_LOCALE_H 1 +/* #undef NEED_BSD_STRINGS */ +/* #undef NEED_SYS_TYPES_H */ +/* #undef NEED_FAR_POINTERS */ +/* #undef NEED_SHORT_EXTERNAL_NAMES */ +/* Define this if you get warnings about undefined structures. */ +/* #undef INCOMPLETE_TYPES_BROKEN */ + +/* Define "boolean" as unsigned char, not int, on Windows systems. */ +#ifdef _WIN32 +#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ +typedef unsigned char boolean; +#endif +#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ +#endif + +#ifdef JPEG_INTERNALS + +/* #undef RIGHT_SHIFT_IS_UNSIGNED */ +#define INLINE __inline__ +/* These are for configuring the JPEG memory manager. */ +/* #undef DEFAULT_MAX_MEM */ +/* #undef NO_MKTEMP */ + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +/* #undef RLE_SUPPORTED */ +#define TARGA_SUPPORTED /* Targa image file format */ + +/* #undef TWO_FILE_COMMANDLINE */ +/* #undef NEED_SIGNAL_CATCHER */ +/* #undef DONT_USE_B_MODE */ + +/* Define this if you want percent-done progress reports from cjpeg/djpeg. */ +/* #undef PROGRESS_REPORT */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/jpeg-8c/jconfig.mac b/jpeg-8c/jconfig.mac new file mode 100644 index 00000000..70ed66c1 --- /dev/null +++ b/jpeg-8c/jconfig.mac @@ -0,0 +1,43 @@ +/* jconfig.mac --- jconfig.h for CodeWarrior on Apple Macintosh */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#define USE_MAC_MEMMGR /* Define this if you use jmemmac.c */ + +#define ALIGN_TYPE long /* Needed for 680x0 Macs */ + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define USE_CCOMMAND /* Command line reader for Macintosh */ +#define TWO_FILE_COMMANDLINE /* Binary I/O thru stdin/stdout doesn't work */ + +#undef NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/jpeg-8c/jconfig.manx b/jpeg-8c/jconfig.manx new file mode 100644 index 00000000..cd529d7d --- /dev/null +++ b/jpeg-8c/jconfig.manx @@ -0,0 +1,43 @@ +/* jconfig.manx --- jconfig.h for Amiga systems using Manx Aztec C ver 5.x. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#define TEMP_DIRECTORY "JPEGTMP:" /* recommended setting for Amiga */ + +#define SHORTxSHORT_32 /* produces better DCT code with Aztec C */ + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE +#define NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#define signal_catcher _abort /* hack for Aztec C naming requirements */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/jpeg-8c/jconfig.mc6 b/jpeg-8c/jconfig.mc6 new file mode 100644 index 00000000..ad5651b8 --- /dev/null +++ b/jpeg-8c/jconfig.mc6 @@ -0,0 +1,52 @@ +/* jconfig.mc6 --- jconfig.h for Microsoft C on MS-DOS, version 6.00A & up. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#define NEED_FAR_POINTERS /* for small or medium memory model */ +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#define USE_MSDOS_MEMMGR /* Define this if you use jmemdos.c */ + +#define MAX_ALLOC_CHUNK 65520L /* Maximum request to malloc() */ + +#define USE_FMEM /* Microsoft has _fmemcpy() and _fmemset() */ + +#define NEED_FHEAPMIN /* far heap management routines are broken */ + +#define SHORTxLCONST_32 /* enable compiler-specific DCT optimization */ +/* Note: the above define is known to improve the code with Microsoft C 6.00A. + * I do not know whether it is good for later compiler versions. + * Please report any info on this point to jpeg-info@uc.ag. + */ + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE +#define USE_SETMODE /* Microsoft has setmode() */ +#define NEED_SIGNAL_CATCHER /* Define this if you use jmemdos.c */ +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/jpeg-8c/jconfig.sas b/jpeg-8c/jconfig.sas new file mode 100644 index 00000000..b8a18192 --- /dev/null +++ b/jpeg-8c/jconfig.sas @@ -0,0 +1,43 @@ +/* jconfig.sas --- jconfig.h for Amiga systems using SAS C 6.0 and up. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#define TEMP_DIRECTORY "JPEGTMP:" /* recommended setting for Amiga */ + +#define NO_MKTEMP /* SAS C doesn't have mktemp() */ + +#define SHORTxSHORT_32 /* produces better DCT code with SAS C */ + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE +#define NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/jpeg-8c/jconfig.st b/jpeg-8c/jconfig.st new file mode 100644 index 00000000..5afa0b6c --- /dev/null +++ b/jpeg-8c/jconfig.st @@ -0,0 +1,42 @@ +/* jconfig.st --- jconfig.h for Atari ST/STE/TT using Pure C or Turbo C. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +#define INCOMPLETE_TYPES_BROKEN /* suppress undefined-structure warnings */ + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#define ALIGN_TYPE long /* apparently double is a weird size? */ + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE /* optional -- undef if you like Unix style */ +/* Note: if you undef TWO_FILE_COMMANDLINE, you may need to define + * USE_SETMODE. Some Atari compilers require it, some do not. + */ +#define NEED_SIGNAL_CATCHER /* needed if you use jmemname.c */ +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/jpeg-8c/jconfig.txt b/jpeg-8c/jconfig.txt new file mode 100644 index 00000000..b96d3124 --- /dev/null +++ b/jpeg-8c/jconfig.txt @@ -0,0 +1,164 @@ +/* + * jconfig.txt + * + * 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 documents the configuration options that are required to + * customize the JPEG software for a particular system. + * + * The actual configuration options for a particular installation are stored + * in jconfig.h. On many machines, jconfig.h can be generated automatically + * or copied from one of the "canned" jconfig files that we supply. But if + * you need to generate a jconfig.h file by hand, this file tells you how. + * + * DO NOT EDIT THIS FILE --- IT WON'T ACCOMPLISH ANYTHING. + * EDIT A COPY NAMED JCONFIG.H. + */ + + +/* + * These symbols indicate the properties of your machine or compiler. + * #define the symbol if yes, #undef it if no. + */ + +/* Does your compiler support function prototypes? + * (If not, you also need to use ansi2knr, see install.txt) + */ +#define HAVE_PROTOTYPES + +/* Does your compiler support the declaration "unsigned char" ? + * How about "unsigned short" ? + */ +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT + +/* Define "void" as "char" if your compiler doesn't know about type void. + * NOTE: be sure to define void such that "void *" represents the most general + * pointer type, e.g., that returned by malloc(). + */ +/* #define void char */ + +/* Define "const" as empty if your compiler doesn't know the "const" keyword. + */ +/* #define const */ + +/* Define this if an ordinary "char" type is unsigned. + * If you're not sure, leaving it undefined will work at some cost in speed. + * If you defined HAVE_UNSIGNED_CHAR then the speed difference is minimal. + */ +#undef CHAR_IS_UNSIGNED + +/* Define this if your system has an ANSI-conforming file. + */ +#define HAVE_STDDEF_H + +/* Define this if your system has an ANSI-conforming file. + */ +#define HAVE_STDLIB_H + +/* Define this if your system does not have an ANSI/SysV , + * but does have a BSD-style . + */ +#undef NEED_BSD_STRINGS + +/* Define this if your system does not provide typedef size_t in any of the + * ANSI-standard places (stddef.h, stdlib.h, or stdio.h), but places it in + * instead. + */ +#undef NEED_SYS_TYPES_H + +/* For 80x86 machines, you need to define NEED_FAR_POINTERS, + * unless you are using a large-data memory model or 80386 flat-memory mode. + * On less brain-damaged CPUs this symbol must not be defined. + * (Defining this symbol causes large data structures to be referenced through + * "far" pointers and to be allocated with a special version of malloc.) + */ +#undef NEED_FAR_POINTERS + +/* Define this if your linker needs global names to be unique in less + * than the first 15 characters. + */ +#undef NEED_SHORT_EXTERNAL_NAMES + +/* Although a real ANSI C compiler can deal perfectly well with pointers to + * unspecified structures (see "incomplete types" in the spec), a few pre-ANSI + * and pseudo-ANSI compilers get confused. To keep one of these bozos happy, + * define INCOMPLETE_TYPES_BROKEN. This is not recommended unless you + * actually get "missing structure definition" warnings or errors while + * compiling the JPEG code. + */ +#undef INCOMPLETE_TYPES_BROKEN + +/* Define "boolean" as unsigned char, not int, on Windows systems. + */ +#ifdef _WIN32 +#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ +typedef unsigned char boolean; +#endif +#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ +#endif + + +/* + * The following options affect code selection within the JPEG library, + * but they don't need to be visible to applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS has been defined. + */ + +#ifdef JPEG_INTERNALS + +/* Define this if your compiler implements ">>" on signed values as a logical + * (unsigned) shift; leave it undefined if ">>" is a signed (arithmetic) shift, + * which is the normal and rational definition. + */ +#undef RIGHT_SHIFT_IS_UNSIGNED + + +#endif /* JPEG_INTERNALS */ + + +/* + * The remaining options do not affect the JPEG library proper, + * but only the sample applications cjpeg/djpeg (see cjpeg.c, djpeg.c). + * Other applications can ignore these. + */ + +#ifdef JPEG_CJPEG_DJPEG + +/* These defines indicate which image (non-JPEG) file formats are allowed. */ + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +/* Define this if you want to name both input and output files on the command + * line, rather than using stdout and optionally stdin. You MUST do this if + * your system can't cope with binary I/O to stdin/stdout. See comments at + * head of cjpeg.c or djpeg.c. + */ +#undef TWO_FILE_COMMANDLINE + +/* Define this if your system needs explicit cleanup of temporary files. + * This is crucial under MS-DOS, where the temporary "files" may be areas + * of extended memory; on most other systems it's not as important. + */ +#undef NEED_SIGNAL_CATCHER + +/* By default, we open image files with fopen(...,"rb") or fopen(...,"wb"). + * This is necessary on systems that distinguish text files from binary files, + * and is harmless on most systems that don't. If you have one of the rare + * systems that complains about the "b" spec, define this symbol. + */ +#undef DONT_USE_B_MODE + +/* Define this if you want percent-done progress reports from cjpeg/djpeg. + */ +#undef PROGRESS_REPORT + + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/jpeg-8c/jconfig.vc b/jpeg-8c/jconfig.vc new file mode 100644 index 00000000..679404da --- /dev/null +++ b/jpeg-8c/jconfig.vc @@ -0,0 +1,45 @@ +/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */ +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +/* Define "boolean" as unsigned char, not int, per Windows custom */ +#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ +typedef unsigned char boolean; +#endif +#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ + + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE /* optional */ +#define USE_SETMODE /* Microsoft has setmode() */ +#undef NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/jpeg-8c/jconfig.vms b/jpeg-8c/jconfig.vms new file mode 100644 index 00000000..8337b0b6 --- /dev/null +++ b/jpeg-8c/jconfig.vms @@ -0,0 +1,37 @@ +/* jconfig.vms --- jconfig.h for use on Digital VMS. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE /* Needed on VMS */ +#undef NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/jpeg-8c/jconfig.wat b/jpeg-8c/jconfig.wat new file mode 100644 index 00000000..190cc75f --- /dev/null +++ b/jpeg-8c/jconfig.wat @@ -0,0 +1,38 @@ +/* jconfig.wat --- jconfig.h for Watcom C/C++ on MS-DOS or OS/2. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#define CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS /* Watcom uses flat 32-bit addressing */ +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#undef TWO_FILE_COMMANDLINE /* optional */ +#define USE_SETMODE /* Needed to make one-file style work in Watcom */ +#undef NEED_SIGNAL_CATCHER /* Define this if you use jmemname.c */ +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/jpeg-8c/jcparam.c b/jpeg-8c/jcparam.c new file mode 100644 index 00000000..c5e85dda --- /dev/null +++ b/jpeg-8c/jcparam.c @@ -0,0 +1,632 @@ +/* + * jcparam.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2003-2008 by Guido Vollbeding. + * 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; +} + + +/* 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 +}; + + +GLOBAL(void) +jpeg_default_qtables (j_compress_ptr cinfo, boolean force_baseline) +/* Set or change the 'quality' (quantization) setting, using default tables + * and straight percentage-scaling quality scales. + * This entry point allows different scalings for luminance and chrominance. + */ +{ + /* Set up two quantization tables using the specified scaling */ + jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl, + cinfo->q_scale_factor[0], force_baseline); + jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl, + cinfo->q_scale_factor[1], force_baseline); +} + + +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. + */ +{ + /* 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->scale_num = 1; /* 1:1 scaling */ + cinfo->scale_denom = 1; + 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; + + /* By default, apply fancy downsampling */ + cinfo->do_fancy_downsampling = TRUE; + + /* 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/jpeg-8c/jcparam.lo b/jpeg-8c/jcparam.lo new file mode 100644 index 00000000..8924db0a --- /dev/null +++ b/jpeg-8c/jcparam.lo @@ -0,0 +1,12 @@ +# jcparam.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jcparam.o' + +# Name of the non-PIC object +non_pic_object='jcparam.o' + diff --git a/jpeg-8c/jcprepct.c b/jpeg-8c/jcprepct.c new file mode 100644 index 00000000..be44cc4b --- /dev/null +++ b/jpeg-8c/jcprepct.c @@ -0,0 +1,358 @@ +/* + * 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++) { + numrows = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; + expand_bottom_edge(output_buf[ci], + compptr->width_in_blocks * compptr->DCT_h_scaled_size, + (int) (*out_row_group_ctr * numrows), + (int) (out_row_groups_avail * numrows)); + } + *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 * + cinfo->min_DCT_h_scaled_size * + 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 * + cinfo->min_DCT_h_scaled_size * + cinfo->max_h_samp_factor) / compptr->h_samp_factor), + (JDIMENSION) cinfo->max_v_samp_factor); + } + } +} diff --git a/jpeg-8c/jcprepct.lo b/jpeg-8c/jcprepct.lo new file mode 100644 index 00000000..ef554981 --- /dev/null +++ b/jpeg-8c/jcprepct.lo @@ -0,0 +1,12 @@ +# jcprepct.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jcprepct.o' + +# Name of the non-PIC object +non_pic_object='jcprepct.o' + diff --git a/jpeg-8c/jcsample.c b/jpeg-8c/jcsample.c new file mode 100644 index 00000000..4d36f85f --- /dev/null +++ b/jpeg-8c/jcsample.c @@ -0,0 +1,545 @@ +/* + * 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]; + + /* Height of an output row group for each component. */ + int rowgroup_height[MAX_COMPONENTS]; + + /* These arrays save pixel expansion factors so that int_downsample need not + * recompute them each time. They are unused for other downsampling methods. + */ + UINT8 h_expand[MAX_COMPONENTS]; + UINT8 v_expand[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 * downsample->rowgroup_height[ci]); + (*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) +{ + my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample; + 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 * compptr->DCT_h_scaled_size; + JSAMPROW inptr, outptr; + INT32 outvalue; + + h_expand = downsample->h_expand[compptr->component_index]; + v_expand = downsample->v_expand[compptr->component_index]; + 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 = outrow = 0; + while (inrow < cinfo->max_v_samp_factor) { + 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; + outrow++; + } +} + + +/* + * 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 * compptr->DCT_h_scaled_size); +} + + +/* + * 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 inrow; + JDIMENSION outcol; + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; + 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 (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { + outptr = output_data[inrow]; + inptr = input_data[inrow]; + 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 * compptr->DCT_h_scaled_size; + 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 = outrow = 0; + while (inrow < cinfo->max_v_samp_factor) { + 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; + outrow++; + } +} + + +#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 * compptr->DCT_h_scaled_size; + 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 = outrow = 0; + while (inrow < cinfo->max_v_samp_factor) { + 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; + outrow++; + } +} + + +/* + * 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 inrow; + JDIMENSION colctr; + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; + 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 (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { + outptr = output_data[inrow]; + inptr = input_data[inrow]; + above_ptr = input_data[inrow-1]; + below_ptr = input_data[inrow+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; + int h_in_group, v_in_group, h_out_group, v_out_group; + + 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++) { + /* Compute size of an "output group" for DCT scaling. This many samples + * are to be converted from max_h_samp_factor * max_v_samp_factor pixels. + */ + h_out_group = (compptr->h_samp_factor * compptr->DCT_h_scaled_size) / + cinfo->min_DCT_h_scaled_size; + v_out_group = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; + h_in_group = cinfo->max_h_samp_factor; + v_in_group = cinfo->max_v_samp_factor; + downsample->rowgroup_height[ci] = v_out_group; /* save for use later */ + if (h_in_group == h_out_group && v_in_group == v_out_group) { +#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 (h_in_group == h_out_group * 2 && + v_in_group == v_out_group) { + smoothok = FALSE; + downsample->methods[ci] = h2v1_downsample; + } else if (h_in_group == h_out_group * 2 && + v_in_group == v_out_group * 2) { +#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 ((h_in_group % h_out_group) == 0 && + (v_in_group % v_out_group) == 0) { + smoothok = FALSE; + downsample->methods[ci] = int_downsample; + downsample->h_expand[ci] = (UINT8) (h_in_group / h_out_group); + downsample->v_expand[ci] = (UINT8) (v_in_group / v_out_group); + } 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/jpeg-8c/jcsample.lo b/jpeg-8c/jcsample.lo new file mode 100644 index 00000000..0973d86f --- /dev/null +++ b/jpeg-8c/jcsample.lo @@ -0,0 +1,12 @@ +# jcsample.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jcsample.o' + +# Name of the non-PIC object +non_pic_object='jcsample.o' + diff --git a/jpeg-8c/jctrans.c b/jpeg-8c/jctrans.c new file mode 100644 index 00000000..cee6b0f3 --- /dev/null +++ b/jpeg-8c/jctrans.c @@ -0,0 +1,382 @@ +/* + * jctrans.c + * + * Copyright (C) 1995-1998, Thomas G. Lane. + * Modified 2000-2009 by Guido Vollbeding. + * 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; + dstinfo->jpeg_width = srcinfo->output_width; + dstinfo->jpeg_height = srcinfo->output_height; + dstinfo->min_DCT_h_scaled_size = srcinfo->min_DCT_h_scaled_size; + dstinfo->min_DCT_v_scaled_size = srcinfo->min_DCT_v_scaled_size; + /* 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) +{ + /* 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) + jinit_arith_encoder(cinfo); + 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/jpeg-8c/jctrans.lo b/jpeg-8c/jctrans.lo new file mode 100644 index 00000000..18020410 --- /dev/null +++ b/jpeg-8c/jctrans.lo @@ -0,0 +1,12 @@ +# jctrans.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jctrans.o' + +# Name of the non-PIC object +non_pic_object='jctrans.o' + diff --git a/jpeg-8c/jdapimin.c b/jpeg-8c/jdapimin.c new file mode 100644 index 00000000..7f1ce4c0 --- /dev/null +++ b/jpeg-8c/jdapimin.c @@ -0,0 +1,396 @@ +/* + * jdapimin.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * 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 = cinfo->block_size; /* 1:1 scaling */ + cinfo->scale_denom = cinfo->block_size; + 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/jpeg-8c/jdapimin.lo b/jpeg-8c/jdapimin.lo new file mode 100644 index 00000000..9419a42d --- /dev/null +++ b/jpeg-8c/jdapimin.lo @@ -0,0 +1,12 @@ +# jdapimin.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdapimin.o' + +# Name of the non-PIC object +non_pic_object='jdapimin.o' + diff --git a/jpeg-8c/jdapistd.c b/jpeg-8c/jdapistd.c new file mode 100644 index 00000000..9d745377 --- /dev/null +++ b/jpeg-8c/jdapistd.c @@ -0,0 +1,275 @@ +/* + * 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_v_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/jpeg-8c/jdapistd.lo b/jpeg-8c/jdapistd.lo new file mode 100644 index 00000000..fb36e2d3 --- /dev/null +++ b/jpeg-8c/jdapistd.lo @@ -0,0 +1,12 @@ +# jdapistd.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdapistd.o' + +# Name of the non-PIC object +non_pic_object='jdapistd.o' + diff --git a/jpeg-8c/jdarith.c b/jpeg-8c/jdarith.c new file mode 100644 index 00000000..c858b248 --- /dev/null +++ b/jpeg-8c/jdarith.c @@ -0,0 +1,772 @@ +/* + * jdarith.c + * + * Developed 1997-2009 by Guido Vollbeding. + * 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 portable arithmetic entropy decoding routines for JPEG + * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81). + * + * Both sequential and progressive modes are supported in this single module. + * + * Suspension is not currently supported in this module. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Expanded entropy decoder object for arithmetic decoding. */ + +typedef struct { + struct jpeg_entropy_decoder pub; /* public fields */ + + INT32 c; /* C register, base of coding interval + input bit buffer */ + INT32 a; /* A register, normalized size of coding interval */ + int ct; /* bit shift counter, # of bits left in bit buffer part of C */ + /* init: ct = -16 */ + /* run: ct = 0..7 */ + /* error: ct = -1 */ + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ + int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */ + + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + + /* Pointers to statistics areas (these workspaces have image lifespan) */ + unsigned char * dc_stats[NUM_ARITH_TBLS]; + unsigned char * ac_stats[NUM_ARITH_TBLS]; + + /* Statistics bin for coding with fixed probability 0.5 */ + unsigned char fixed_bin[4]; +} arith_entropy_decoder; + +typedef arith_entropy_decoder * arith_entropy_ptr; + +/* The following two definitions specify the allocation chunk size + * for the statistics area. + * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least + * 49 statistics bins for DC, and 245 statistics bins for AC coding. + * + * We use a compact representation with 1 byte per statistics bin, + * thus the numbers directly represent byte sizes. + * This 1 byte per statistics bin contains the meaning of the MPS + * (more probable symbol) in the highest bit (mask 0x80), and the + * index into the probability estimation state machine table + * in the lower bits (mask 0x7F). + */ + +#define DC_STAT_BINS 64 +#define AC_STAT_BINS 256 + + +LOCAL(int) +get_byte (j_decompress_ptr cinfo) +/* Read next input byte; we do not support suspension in this module. */ +{ + struct jpeg_source_mgr * src = cinfo->src; + + if (src->bytes_in_buffer == 0) + if (! (*src->fill_input_buffer) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + src->bytes_in_buffer--; + return GETJOCTET(*src->next_input_byte++); +} + + +/* + * The core arithmetic decoding routine (common in JPEG and JBIG). + * This needs to go as fast as possible. + * Machine-dependent optimization facilities + * are not utilized in this portable implementation. + * However, this code should be fairly efficient and + * may be a good base for further optimizations anyway. + * + * Return value is 0 or 1 (binary decision). + * + * Note: I've changed the handling of the code base & bit + * buffer register C compared to other implementations + * based on the standards layout & procedures. + * While it also contains both the actual base of the + * coding interval (16 bits) and the next-bits buffer, + * the cut-point between these two parts is floating + * (instead of fixed) with the bit shift counter CT. + * Thus, we also need only one (variable instead of + * fixed size) shift for the LPS/MPS decision, and + * we can get away with any renormalization update + * of C (except for new data insertion, of course). + * + * I've also introduced a new scheme for accessing + * the probability estimation state machine table, + * derived from Markus Kuhn's JBIG implementation. + */ + +LOCAL(int) +arith_decode (j_decompress_ptr cinfo, unsigned char *st) +{ + register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy; + register unsigned char nl, nm; + register INT32 qe, temp; + register int sv, data; + + /* Renormalization & data input per section D.2.6 */ + while (e->a < 0x8000L) { + if (--e->ct < 0) { + /* Need to fetch next data byte */ + if (cinfo->unread_marker) + data = 0; /* stuff zero data */ + else { + data = get_byte(cinfo); /* read next input byte */ + if (data == 0xFF) { /* zero stuff or marker code */ + do data = get_byte(cinfo); + while (data == 0xFF); /* swallow extra 0xFF bytes */ + if (data == 0) + data = 0xFF; /* discard stuffed zero byte */ + else { + /* Note: Different from the Huffman decoder, hitting + * a marker while processing the compressed data + * segment is legal in arithmetic coding. + * The convention is to supply zero data + * then until decoding is complete. + */ + cinfo->unread_marker = data; + data = 0; + } + } + } + e->c = (e->c << 8) | data; /* insert data into C register */ + if ((e->ct += 8) < 0) /* update bit shift counter */ + /* Need more initial bytes */ + if (++e->ct == 0) + /* Got 2 initial bytes -> re-init A and exit loop */ + e->a = 0x8000L; /* => e->a = 0x10000L after loop exit */ + } + e->a <<= 1; + } + + /* Fetch values from our compact representation of Table D.2: + * Qe values and probability estimation state machine + */ + sv = *st; + qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */ + nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */ + nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */ + + /* Decode & estimation procedures per sections D.2.4 & D.2.5 */ + temp = e->a - qe; + e->a = temp; + temp <<= e->ct; + if (e->c >= temp) { + e->c -= temp; + /* Conditional LPS (less probable symbol) exchange */ + if (e->a < qe) { + e->a = qe; + *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */ + } else { + e->a = qe; + *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */ + sv ^= 0x80; /* Exchange LPS/MPS */ + } + } else if (e->a < 0x8000L) { + /* Conditional MPS (more probable symbol) exchange */ + if (e->a < qe) { + *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */ + sv ^= 0x80; /* Exchange LPS/MPS */ + } else { + *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */ + } + } + + return sv >> 7; +} + + +/* + * Check for a restart marker & resynchronize decoder. + */ + +LOCAL(void) +process_restart (j_decompress_ptr cinfo) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci; + jpeg_component_info * compptr; + + /* Advance past the RSTn marker */ + if (! (*cinfo->marker->read_restart_marker) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + + /* Re-initialize statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) { + MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS); + /* Reset DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + if ((! cinfo->progressive_mode && cinfo->lim_Se) || + (cinfo->progressive_mode && cinfo->Ss)) { + MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS); + } + } + + /* Reset arithmetic decoding variables */ + entropy->c = 0; + entropy->a = 0; + entropy->ct = -16; /* force reading 2 initial bytes to fill C */ + + /* Reset restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + +/* + * Arithmetic MCU decoding. + * Each of these routines decodes and returns one MCU's worth of + * arithmetic-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. + */ + +/* + * 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) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl, sign; + int v, m; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + /* 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]; + tbl = cinfo->cur_comp_info[ci]->dc_tbl_no; + + /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */ + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.19: Decode_DC_DIFF */ + if (arith_decode(cinfo, st) == 0) + entropy->dc_context[ci] = 0; + else { + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, st + 1); + st += 2; st += sign; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */ + else + entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */ + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + entropy->last_dc_val[ci] += v; + } + + /* Scale and output the DC coefficient (assumes jpeg_natural_order[0]=0) */ + (*block)[0] = (JCOEF) (entropy->last_dc_val[ci] << cinfo->Al); + } + + 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) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int tbl, sign, k; + int v, m; + const int * natural_order; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + natural_order = cinfo->natural_order; + + /* There is always only one block per MCU */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */ + + /* Figure F.20: Decode_AC_coefficients */ + for (k = cinfo->Ss; k <= cinfo->Se; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + if (arith_decode(cinfo, st)) break; /* EOB flag */ + while (arith_decode(cinfo, st + 1) == 0) { + st += 3; k++; + if (k > cinfo->Se) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* spectral overflow */ + return TRUE; + } + } + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, entropy->fixed_bin); + st += 2; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + if (arith_decode(cinfo, st)) { + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + } + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + /* Scale and output coefficient in natural (dezigzagged) order */ + (*block)[natural_order[k]] = (JCOEF) (v << cinfo->Al); + } + + return TRUE; +} + + +/* + * MCU decoding for DC successive approximation refinement scan. + */ + +METHODDEF(boolean) +decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + unsigned char *st; + int p1, blkn; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + st = entropy->fixed_bin; /* use fixed probability estimation */ + p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + /* Encoded data is simply the next bit of the two's-complement DC value */ + if (arith_decode(cinfo, st)) + MCU_data[blkn][0][0] |= p1; + } + + return TRUE; +} + + +/* + * MCU decoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + JCOEFPTR thiscoef; + unsigned char *st; + int tbl, k, kex; + int p1, m1; + const int * natural_order; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + natural_order = cinfo->natural_order; + + /* There is always only one block per MCU */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */ + + /* Establish EOBx (previous stage end-of-block) index */ + for (kex = cinfo->Se; kex > 0; kex--) + if ((*block)[natural_order[kex]]) break; + + for (k = cinfo->Ss; k <= cinfo->Se; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + if (k > kex) + if (arith_decode(cinfo, st)) break; /* EOB flag */ + for (;;) { + thiscoef = *block + natural_order[k]; + if (*thiscoef) { /* previously nonzero coef */ + if (arith_decode(cinfo, st + 2)) { + if (*thiscoef < 0) + *thiscoef += m1; + else + *thiscoef += p1; + } + break; + } + if (arith_decode(cinfo, st + 1)) { /* newly nonzero coef */ + if (arith_decode(cinfo, entropy->fixed_bin)) + *thiscoef = m1; + else + *thiscoef = p1; + break; + } + st += 3; k++; + if (k > cinfo->Se) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* spectral overflow */ + return TRUE; + } + } + } + + return TRUE; +} + + +/* + * Decode one MCU's worth of arithmetic-compressed coefficients. + */ + +METHODDEF(boolean) +decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + jpeg_component_info * compptr; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl, sign, k; + int v, m; + const int * natural_order; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + natural_order = cinfo->natural_order; + + /* 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]; + + /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */ + + tbl = compptr->dc_tbl_no; + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.19: Decode_DC_DIFF */ + if (arith_decode(cinfo, st) == 0) + entropy->dc_context[ci] = 0; + else { + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, st + 1); + st += 2; st += sign; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */ + else + entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */ + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + entropy->last_dc_val[ci] += v; + } + + (*block)[0] = (JCOEF) entropy->last_dc_val[ci]; + + /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */ + + tbl = compptr->ac_tbl_no; + + /* Figure F.20: Decode_AC_coefficients */ + for (k = 1; k <= cinfo->lim_Se; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + if (arith_decode(cinfo, st)) break; /* EOB flag */ + while (arith_decode(cinfo, st + 1) == 0) { + st += 3; k++; + if (k > cinfo->lim_Se) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* spectral overflow */ + return TRUE; + } + } + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, entropy->fixed_bin); + st += 2; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + if (arith_decode(cinfo, st)) { + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + } + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + (*block)[natural_order[k]] = (JCOEF) v; + } + } + + return TRUE; +} + + +/* + * Initialize for an arithmetic-compressed scan. + */ + +METHODDEF(void) +start_pass (j_decompress_ptr cinfo) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci, tbl; + jpeg_component_info * compptr; + + if (cinfo->progressive_mode) { + /* Validate progressive scan parameters */ + if (cinfo->Ss == 0) { + if (cinfo->Se != 0) + goto bad; + } else { + /* need not check Ss/Se < 0 since they came from unsigned bytes */ + if (cinfo->Se < cinfo->Ss || cinfo->Se > cinfo->lim_Se) + goto bad; + /* AC scans may have only one component */ + if (cinfo->comps_in_scan != 1) + goto bad; + } + if (cinfo->Ah != 0) { + /* Successive approximation refinement scan: must have Al = Ah-1. */ + if (cinfo->Ah-1 != cinfo->Al) + goto bad; + } + if (cinfo->Al > 13) { /* need not check for < 0 */ + 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 coefi, cindex = cinfo->cur_comp_info[ci]->component_index; + int *coef_bit_ptr = & cinfo->coef_bits[cindex][0]; + if (cinfo->Ss && 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 (cinfo->Ss == 0) + entropy->pub.decode_mcu = decode_mcu_DC_first; + else + entropy->pub.decode_mcu = decode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + entropy->pub.decode_mcu = decode_mcu_DC_refine; + else + entropy->pub.decode_mcu = decode_mcu_AC_refine; + } + } else { + /* 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. + */ + if (cinfo->Ss != 0 || cinfo->Ah != 0 || cinfo->Al != 0 || + (cinfo->Se < DCTSIZE2 && cinfo->Se != cinfo->lim_Se)) + WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); + /* Select MCU decoding routine */ + entropy->pub.decode_mcu = decode_mcu; + } + + /* Allocate & initialize requested statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) { + tbl = compptr->dc_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->dc_stats[tbl] == NULL) + entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS); + MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS); + /* Initialize DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + if ((! cinfo->progressive_mode && cinfo->lim_Se) || + (cinfo->progressive_mode && cinfo->Ss)) { + tbl = compptr->ac_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->ac_stats[tbl] == NULL) + entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS); + MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS); + } + } + + /* Initialize arithmetic decoding variables */ + entropy->c = 0; + entropy->a = 0; + entropy->ct = -16; /* force reading 2 initial bytes to fill C */ + + /* Initialize restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + +/* + * Module initialization routine for arithmetic entropy decoding. + */ + +GLOBAL(void) +jinit_arith_decoder (j_decompress_ptr cinfo) +{ + arith_entropy_ptr entropy; + int i; + + entropy = (arith_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(arith_entropy_decoder)); + cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; + entropy->pub.start_pass = start_pass; + + /* Mark tables unallocated */ + for (i = 0; i < NUM_ARITH_TBLS; i++) { + entropy->dc_stats[i] = NULL; + entropy->ac_stats[i] = NULL; + } + + /* Initialize index for fixed probability estimation */ + entropy->fixed_bin[0] = 113; + + if (cinfo->progressive_mode) { + /* Create progression status table */ + int *coef_bit_ptr, ci; + 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; + } +} diff --git a/jpeg-8c/jdarith.lo b/jpeg-8c/jdarith.lo new file mode 100644 index 00000000..b4e92e32 --- /dev/null +++ b/jpeg-8c/jdarith.lo @@ -0,0 +1,12 @@ +# jdarith.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdarith.o' + +# Name of the non-PIC object +non_pic_object='jdarith.o' + diff --git a/jpeg-8c/jdatadst.c b/jpeg-8c/jdatadst.c new file mode 100644 index 00000000..472d5f32 --- /dev/null +++ b/jpeg-8c/jdatadst.c @@ -0,0 +1,267 @@ +/* + * jdatadst.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * 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 memory or 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" + +#ifndef HAVE_STDLIB_H /* should declare malloc(),free() */ +extern void * malloc JPP((size_t size)); +extern void free JPP((void *ptr)); +#endif + + +/* 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 */ + + +/* Expanded data destination object for memory output */ + +typedef struct { + struct jpeg_destination_mgr pub; /* public fields */ + + unsigned char ** outbuffer; /* target buffer */ + unsigned long * outsize; + unsigned char * newbuffer; /* newly allocated buffer */ + JOCTET * buffer; /* start of buffer */ + size_t bufsize; +} my_mem_destination_mgr; + +typedef my_mem_destination_mgr * my_mem_dest_ptr; + + +/* + * 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; +} + +METHODDEF(void) +init_mem_destination (j_compress_ptr cinfo) +{ + /* no work necessary here */ +} + + +/* + * 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; +} + +METHODDEF(boolean) +empty_mem_output_buffer (j_compress_ptr cinfo) +{ + size_t nextsize; + JOCTET * nextbuffer; + my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest; + + /* Try to allocate new buffer with double size */ + nextsize = dest->bufsize * 2; + nextbuffer = malloc(nextsize); + + if (nextbuffer == NULL) + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10); + + MEMCOPY(nextbuffer, dest->buffer, dest->bufsize); + + if (dest->newbuffer != NULL) + free(dest->newbuffer); + + dest->newbuffer = nextbuffer; + + dest->pub.next_output_byte = nextbuffer + dest->bufsize; + dest->pub.free_in_buffer = dest->bufsize; + + dest->buffer = nextbuffer; + dest->bufsize = nextsize; + + 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); +} + +METHODDEF(void) +term_mem_destination (j_compress_ptr cinfo) +{ + my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest; + + *dest->outbuffer = dest->buffer; + *dest->outsize = dest->bufsize - dest->pub.free_in_buffer; +} + + +/* + * 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; +} + + +/* + * Prepare for output to a memory buffer. + * The caller may supply an own initial buffer with appropriate size. + * Otherwise, or when the actual data output exceeds the given size, + * the library adapts the buffer size as necessary. + * The standard library functions malloc/free are used for allocating + * larger memory, so the buffer is available to the application after + * finishing compression, and then the application is responsible for + * freeing the requested memory. + */ + +GLOBAL(void) +jpeg_mem_dest (j_compress_ptr cinfo, + unsigned char ** outbuffer, unsigned long * outsize) +{ + my_mem_dest_ptr dest; + + if (outbuffer == NULL || outsize == NULL) /* sanity check */ + ERREXIT(cinfo, JERR_BUFFER_SIZE); + + /* The destination object is made permanent so that multiple JPEG images + * can be written to the same buffer without re-executing jpeg_mem_dest. + */ + 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_mem_destination_mgr)); + } + + dest = (my_mem_dest_ptr) cinfo->dest; + dest->pub.init_destination = init_mem_destination; + dest->pub.empty_output_buffer = empty_mem_output_buffer; + dest->pub.term_destination = term_mem_destination; + dest->outbuffer = outbuffer; + dest->outsize = outsize; + dest->newbuffer = NULL; + + if (*outbuffer == NULL || *outsize == 0) { + /* Allocate initial buffer */ + dest->newbuffer = *outbuffer = malloc(OUTPUT_BUF_SIZE); + if (dest->newbuffer == NULL) + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10); + *outsize = OUTPUT_BUF_SIZE; + } + + dest->pub.next_output_byte = dest->buffer = *outbuffer; + dest->pub.free_in_buffer = dest->bufsize = *outsize; +} diff --git a/jpeg-8c/jdatadst.lo b/jpeg-8c/jdatadst.lo new file mode 100644 index 00000000..4139f2b9 --- /dev/null +++ b/jpeg-8c/jdatadst.lo @@ -0,0 +1,12 @@ +# jdatadst.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdatadst.o' + +# Name of the non-PIC object +non_pic_object='jdatadst.o' + diff --git a/jpeg-8c/jdatasrc.c b/jpeg-8c/jdatasrc.c new file mode 100644 index 00000000..c8fe3daf --- /dev/null +++ b/jpeg-8c/jdatasrc.c @@ -0,0 +1,274 @@ +/* + * jdatasrc.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2009-2010 by Guido Vollbeding. + * 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 memory or 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; +} + +METHODDEF(void) +init_mem_source (j_decompress_ptr cinfo) +{ + /* no work necessary here */ +} + + +/* + * 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; +} + +METHODDEF(boolean) +fill_mem_input_buffer (j_decompress_ptr cinfo) +{ + static JOCTET mybuffer[4]; + + /* The whole JPEG data is expected to reside in the supplied memory + * buffer, so any request for more data beyond the given buffer size + * is treated as an error. + */ + WARNMS(cinfo, JWRN_JPEG_EOF); + /* Insert a fake EOI marker */ + mybuffer[0] = (JOCTET) 0xFF; + mybuffer[1] = (JOCTET) JPEG_EOI; + + cinfo->src->next_input_byte = mybuffer; + cinfo->src->bytes_in_buffer = 2; + + 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) +{ + struct jpeg_source_mgr * src = 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->bytes_in_buffer) { + num_bytes -= (long) src->bytes_in_buffer; + (void) (*src->fill_input_buffer) (cinfo); + /* note we assume that fill_input_buffer will never return FALSE, + * so suspension need not be handled. + */ + } + src->next_input_byte += (size_t) num_bytes; + src->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 */ +} + + +/* + * Prepare for input from a supplied memory buffer. + * The buffer must contain the whole JPEG data. + */ + +GLOBAL(void) +jpeg_mem_src (j_decompress_ptr cinfo, + unsigned char * inbuffer, unsigned long insize) +{ + struct jpeg_source_mgr * src; + + if (inbuffer == NULL || insize == 0) /* Treat empty input as fatal error */ + ERREXIT(cinfo, JERR_INPUT_EMPTY); + + /* The source object is made permanent so that a series of JPEG images + * can be read from the same buffer by calling jpeg_mem_src only before + * the first one. + */ + 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(struct jpeg_source_mgr)); + } + + src = cinfo->src; + src->init_source = init_mem_source; + src->fill_input_buffer = fill_mem_input_buffer; + src->skip_input_data = skip_input_data; + src->resync_to_restart = jpeg_resync_to_restart; /* use default method */ + src->term_source = term_source; + src->bytes_in_buffer = (size_t) insize; + src->next_input_byte = (JOCTET *) inbuffer; +} diff --git a/jpeg-8c/jdatasrc.lo b/jpeg-8c/jdatasrc.lo new file mode 100644 index 00000000..247fa99a --- /dev/null +++ b/jpeg-8c/jdatasrc.lo @@ -0,0 +1,12 @@ +# jdatasrc.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdatasrc.o' + +# Name of the non-PIC object +non_pic_object='jdatasrc.o' + diff --git a/jpeg-8c/jdcoefct.c b/jpeg-8c/jdcoefct.c new file mode 100644 index 00000000..462e92c6 --- /dev/null +++ b/jpeg-8c/jdcoefct.c @@ -0,0 +1,736 @@ +/* + * 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_v_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_h_scaled_size; + } + } + blkn += compptr->MCU_width; + output_ptr += compptr->DCT_v_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_h_scaled_size; + } + output_ptr += compptr->DCT_v_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_h_scaled_size; + } + output_ptr += compptr->DCT_v_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/jpeg-8c/jdcoefct.lo b/jpeg-8c/jdcoefct.lo new file mode 100644 index 00000000..db3ed4d5 --- /dev/null +++ b/jpeg-8c/jdcoefct.lo @@ -0,0 +1,12 @@ +# jdcoefct.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdcoefct.o' + +# Name of the non-PIC object +non_pic_object='jdcoefct.o' + diff --git a/jpeg-8c/jdcolor.c b/jpeg-8c/jdcolor.c new file mode 100644 index 00000000..6c04dfe8 --- /dev/null +++ b/jpeg-8c/jdcolor.c @@ -0,0 +1,396 @@ +/* + * 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/jpeg-8c/jdcolor.lo b/jpeg-8c/jdcolor.lo new file mode 100644 index 00000000..a16ce105 --- /dev/null +++ b/jpeg-8c/jdcolor.lo @@ -0,0 +1,12 @@ +# jdcolor.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdcolor.o' + +# Name of the non-PIC object +non_pic_object='jdcolor.o' + diff --git a/jpeg-8c/jdct.h b/jpeg-8c/jdct.h new file mode 100644 index 00000000..360dec80 --- /dev/null +++ b/jpeg-8c/jdct.h @@ -0,0 +1,393 @@ +/* + * 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 an input sample array and + * 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 input data is to be fetched from 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 FDCT code.) + * Note that the number of samples fetched by the FDCT routine is + * DCT_h_scaled_size * DCT_v_scaled_size. + * 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, + JSAMPARRAY sample_data, + JDIMENSION start_col)); +typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data, + JSAMPARRAY sample_data, + JDIMENSION start_col)); + + +/* + * 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_h_scaled_size * DCT_v_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_fdct_7x7 jFD7x7 +#define jpeg_fdct_6x6 jFD6x6 +#define jpeg_fdct_5x5 jFD5x5 +#define jpeg_fdct_4x4 jFD4x4 +#define jpeg_fdct_3x3 jFD3x3 +#define jpeg_fdct_2x2 jFD2x2 +#define jpeg_fdct_1x1 jFD1x1 +#define jpeg_fdct_9x9 jFD9x9 +#define jpeg_fdct_10x10 jFD10x10 +#define jpeg_fdct_11x11 jFD11x11 +#define jpeg_fdct_12x12 jFD12x12 +#define jpeg_fdct_13x13 jFD13x13 +#define jpeg_fdct_14x14 jFD14x14 +#define jpeg_fdct_15x15 jFD15x15 +#define jpeg_fdct_16x16 jFD16x16 +#define jpeg_fdct_16x8 jFD16x8 +#define jpeg_fdct_14x7 jFD14x7 +#define jpeg_fdct_12x6 jFD12x6 +#define jpeg_fdct_10x5 jFD10x5 +#define jpeg_fdct_8x4 jFD8x4 +#define jpeg_fdct_6x3 jFD6x3 +#define jpeg_fdct_4x2 jFD4x2 +#define jpeg_fdct_2x1 jFD2x1 +#define jpeg_fdct_8x16 jFD8x16 +#define jpeg_fdct_7x14 jFD7x14 +#define jpeg_fdct_6x12 jFD6x12 +#define jpeg_fdct_5x10 jFD5x10 +#define jpeg_fdct_4x8 jFD4x8 +#define jpeg_fdct_3x6 jFD3x6 +#define jpeg_fdct_2x4 jFD2x4 +#define jpeg_fdct_1x2 jFD1x2 +#define jpeg_idct_islow jRDislow +#define jpeg_idct_ifast jRDifast +#define jpeg_idct_float jRDfloat +#define jpeg_idct_7x7 jRD7x7 +#define jpeg_idct_6x6 jRD6x6 +#define jpeg_idct_5x5 jRD5x5 +#define jpeg_idct_4x4 jRD4x4 +#define jpeg_idct_3x3 jRD3x3 +#define jpeg_idct_2x2 jRD2x2 +#define jpeg_idct_1x1 jRD1x1 +#define jpeg_idct_9x9 jRD9x9 +#define jpeg_idct_10x10 jRD10x10 +#define jpeg_idct_11x11 jRD11x11 +#define jpeg_idct_12x12 jRD12x12 +#define jpeg_idct_13x13 jRD13x13 +#define jpeg_idct_14x14 jRD14x14 +#define jpeg_idct_15x15 jRD15x15 +#define jpeg_idct_16x16 jRD16x16 +#define jpeg_idct_16x8 jRD16x8 +#define jpeg_idct_14x7 jRD14x7 +#define jpeg_idct_12x6 jRD12x6 +#define jpeg_idct_10x5 jRD10x5 +#define jpeg_idct_8x4 jRD8x4 +#define jpeg_idct_6x3 jRD6x3 +#define jpeg_idct_4x2 jRD4x2 +#define jpeg_idct_2x1 jRD2x1 +#define jpeg_idct_8x16 jRD8x16 +#define jpeg_idct_7x14 jRD7x14 +#define jpeg_idct_6x12 jRD6x12 +#define jpeg_idct_5x10 jRD5x10 +#define jpeg_idct_4x8 jRD4x8 +#define jpeg_idct_3x6 jRD3x8 +#define jpeg_idct_2x4 jRD2x4 +#define jpeg_idct_1x2 jRD1x2 +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + +/* Extern declarations for the forward and inverse DCT routines. */ + +EXTERN(void) jpeg_fdct_islow + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_ifast + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_float + JPP((FAST_FLOAT * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_7x7 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_6x6 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_5x5 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_4x4 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_3x3 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_2x2 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_1x1 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_9x9 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_10x10 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_11x11 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_12x12 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_13x13 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_14x14 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_15x15 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_16x16 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_16x8 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_14x7 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_12x6 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_10x5 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_8x4 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_6x3 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_4x2 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_2x1 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_8x16 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_7x14 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_6x12 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_5x10 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_4x8 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_3x6 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_2x4 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_1x2 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); + +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_7x7 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_6x6 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_5x5 + 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_3x3 + 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)); +EXTERN(void) jpeg_idct_9x9 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_10x10 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_11x11 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_12x12 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_13x13 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_14x14 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_15x15 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_16x16 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_16x8 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_14x7 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_12x6 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_10x5 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_8x4 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_6x3 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_4x2 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_2x1 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_8x16 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_7x14 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_6x12 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_5x10 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_4x8 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_3x6 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_2x4 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_1x2 + 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/jpeg-8c/jddctmgr.c b/jpeg-8c/jddctmgr.c new file mode 100644 index 00000000..0ded9d57 --- /dev/null +++ b/jpeg-8c/jddctmgr.c @@ -0,0 +1,384 @@ +/* + * jddctmgr.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2002-2010 by Guido Vollbeding. + * 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_h_scaled_size << 8) + compptr->DCT_v_scaled_size) { +#ifdef IDCT_SCALING_SUPPORTED + case ((1 << 8) + 1): + method_ptr = jpeg_idct_1x1; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((2 << 8) + 2): + method_ptr = jpeg_idct_2x2; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((3 << 8) + 3): + method_ptr = jpeg_idct_3x3; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((4 << 8) + 4): + method_ptr = jpeg_idct_4x4; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((5 << 8) + 5): + method_ptr = jpeg_idct_5x5; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((6 << 8) + 6): + method_ptr = jpeg_idct_6x6; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((7 << 8) + 7): + method_ptr = jpeg_idct_7x7; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((9 << 8) + 9): + method_ptr = jpeg_idct_9x9; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((10 << 8) + 10): + method_ptr = jpeg_idct_10x10; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((11 << 8) + 11): + method_ptr = jpeg_idct_11x11; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((12 << 8) + 12): + method_ptr = jpeg_idct_12x12; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((13 << 8) + 13): + method_ptr = jpeg_idct_13x13; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((14 << 8) + 14): + method_ptr = jpeg_idct_14x14; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((15 << 8) + 15): + method_ptr = jpeg_idct_15x15; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((16 << 8) + 16): + method_ptr = jpeg_idct_16x16; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((16 << 8) + 8): + method_ptr = jpeg_idct_16x8; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((14 << 8) + 7): + method_ptr = jpeg_idct_14x7; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((12 << 8) + 6): + method_ptr = jpeg_idct_12x6; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((10 << 8) + 5): + method_ptr = jpeg_idct_10x5; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((8 << 8) + 4): + method_ptr = jpeg_idct_8x4; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((6 << 8) + 3): + method_ptr = jpeg_idct_6x3; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((4 << 8) + 2): + method_ptr = jpeg_idct_4x2; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((2 << 8) + 1): + method_ptr = jpeg_idct_2x1; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((8 << 8) + 16): + method_ptr = jpeg_idct_8x16; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((7 << 8) + 14): + method_ptr = jpeg_idct_7x14; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((6 << 8) + 12): + method_ptr = jpeg_idct_6x12; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((5 << 8) + 10): + method_ptr = jpeg_idct_5x10; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((4 << 8) + 8): + method_ptr = jpeg_idct_4x8; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((3 << 8) + 6): + method_ptr = jpeg_idct_3x6; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((2 << 8) + 4): + method_ptr = jpeg_idct_2x4; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((1 << 8) + 2): + method_ptr = jpeg_idct_1x2; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; +#endif + case ((DCTSIZE << 8) + 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: + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, + compptr->DCT_h_scaled_size, compptr->DCT_v_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 + * We apply a further scale factor of 1/8. + */ + 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] * 0.125); + 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/jpeg-8c/jddctmgr.lo b/jpeg-8c/jddctmgr.lo new file mode 100644 index 00000000..bb27c476 --- /dev/null +++ b/jpeg-8c/jddctmgr.lo @@ -0,0 +1,12 @@ +# jddctmgr.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jddctmgr.o' + +# Name of the non-PIC object +non_pic_object='jddctmgr.o' + diff --git a/jpeg-8c/jdhuff.c b/jpeg-8c/jdhuff.c new file mode 100644 index 00000000..06f92fe4 --- /dev/null +++ b/jpeg-8c/jdhuff.c @@ -0,0 +1,1541 @@ +/* + * jdhuff.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2006-2009 by Guido Vollbeding. + * 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. + * Both sequential and progressive modes are supported in this single module. + * + * 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" + + +/* 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)))) & BIT_MASK(nbits)) + +#define PEEK_BITS(nbits) \ + (((int) (get_buffer >> (bits_left - (nbits)))) & BIT_MASK(nbits)) + +#define DROP_BITS(nbits) \ + (bits_left -= (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; \ + } \ +} + + +/* + * 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 { + 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. */ + boolean insufficient_data; /* set TRUE after emitting warning */ + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + + /* Following two fields used only in progressive mode */ + + /* 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 */ + + /* Following fields used only in sequential mode */ + + /* 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 */ + int coef_limit[D_MAX_BLOCKS_IN_MCU]; +} huff_entropy_decoder; + +typedef huff_entropy_decoder * huff_entropy_ptr; + + +static const int jpeg_zigzag_order[8][8] = { + { 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 } +}; + +static const int jpeg_zigzag_order7[7][7] = { + { 0, 1, 5, 6, 14, 15, 27 }, + { 2, 4, 7, 13, 16, 26, 28 }, + { 3, 8, 12, 17, 25, 29, 38 }, + { 9, 11, 18, 24, 30, 37, 39 }, + { 10, 19, 23, 31, 36, 40, 45 }, + { 20, 22, 32, 35, 41, 44, 46 }, + { 21, 33, 34, 42, 43, 47, 48 } +}; + +static const int jpeg_zigzag_order6[6][6] = { + { 0, 1, 5, 6, 14, 15 }, + { 2, 4, 7, 13, 16, 25 }, + { 3, 8, 12, 17, 24, 26 }, + { 9, 11, 18, 23, 27, 32 }, + { 10, 19, 22, 28, 31, 33 }, + { 20, 21, 29, 30, 34, 35 } +}; + +static const int jpeg_zigzag_order5[5][5] = { + { 0, 1, 5, 6, 14 }, + { 2, 4, 7, 13, 15 }, + { 3, 8, 12, 16, 21 }, + { 9, 11, 17, 20, 22 }, + { 10, 18, 19, 23, 24 } +}; + +static const int jpeg_zigzag_order4[4][4] = { + { 0, 1, 5, 6 }, + { 2, 4, 7, 12 }, + { 3, 8, 11, 13 }, + { 9, 10, 14, 15 } +}; + +static const int jpeg_zigzag_order3[3][3] = { + { 0, 1, 5 }, + { 2, 4, 6 }, + { 3, 7, 8 } +}; + +static const int jpeg_zigzag_order2[2][2] = { + { 0, 1 }, + { 2, 3 } +}; + + +/* + * Compute the derived values for a Huffman table. + * This routine also performs some validation checks on the table. + */ + +LOCAL(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. + * 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 + + +LOCAL(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 (! ((huff_entropy_ptr) cinfo->entropy)->insufficient_data) { + WARNMS(cinfo, JWRN_HIT_MARKER); + ((huff_entropy_ptr) 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; +} + + +/* + * Figure F.12: extend sign bit. + * On some machines, a shift and sub will be faster than a table lookup. + */ + +#ifdef AVOID_TABLES + +#define BIT_MASK(nbits) ((1<<(nbits))-1) +#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) - ((1<<(s))-1) : (x)) + +#else + +#define BIT_MASK(nbits) bmask[nbits] +#define HUFF_EXTEND(x,s) ((x) <= bmask[(s) - 1] ? (x) - bmask[s] : (x)) + +static const int bmask[16] = /* bmask[n] is mask for n rightmost bits */ + { 0, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, + 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF }; + +#endif /* AVOID_TABLES */ + + +/* + * Out-of-line code for Huffman code decoding. + */ + +LOCAL(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]) ]; +} + + +/* + * 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; + /* 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->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. + * (Wholesale zeroing is usually a little faster than retail...) + * + * 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) +{ + huff_entropy_ptr entropy = (huff_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->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) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int s, k, r; + unsigned int EOBRUN; + int Se, Al; + const int * natural_order; + 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->insufficient_data) { + + Se = cinfo->Se; + Al = cinfo->Al; + natural_order = cinfo->natural_order; + + /* 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)[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) +{ + huff_entropy_ptr entropy = (huff_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) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int s, k, r; + unsigned int EOBRUN; + int Se, p1, m1; + const int * natural_order; + 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->insufficient_data) { + + Se = cinfo->Se; + p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */ + natural_order = cinfo->natural_order; + + /* 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 + 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 = 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 + 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; +} + + +/* + * Decode one MCU's worth of Huffman-compressed coefficients, + * partial blocks. + */ + +METHODDEF(boolean) +decode_mcu_sub (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + const int * natural_order; + int Se, 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->insufficient_data) { + + natural_order = cinfo->natural_order; + Se = cinfo->lim_Se; + + /* 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 * htbl; + register int s, k, r; + int coef_limit, ci; + + /* Decode a single block's worth of coefficients */ + + /* Section F.2.2.1: decode the DC coefficient difference */ + htbl = entropy->dc_cur_tbls[blkn]; + HUFF_DECODE(s, br_state, htbl, return FALSE, label1); + + htbl = entropy->ac_cur_tbls[blkn]; + k = 1; + coef_limit = entropy->coef_limit[blkn]; + if (coef_limit) { + /* Convert DC difference to actual value, update last_dc_val */ + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + } + ci = cinfo->MCU_membership[blkn]; + s += state.last_dc_val[ci]; + state.last_dc_val[ci] = s; + /* Output the DC coefficient */ + (*block)[0] = (JCOEF) s; + + /* Section F.2.2.2: decode the AC coefficients */ + /* Since zeroes are skipped, output area must be cleared beforehand */ + for (; k < coef_limit; k++) { + HUFF_DECODE(s, br_state, htbl, 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 natural_order[] will save us + * if k > Se, which could happen if the data is corrupted. + */ + (*block)[natural_order[k]] = (JCOEF) s; + } else { + if (r != 15) + goto EndOfBlock; + k += 15; + } + } + } else { + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); + } + } + + /* Section F.2.2.2: decode the AC coefficients */ + /* In this path we just discard the values */ + for (; k <= Se; k++) { + HUFF_DECODE(s, br_state, htbl, 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; + } + } + + EndOfBlock: ; + } + + /* 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; +} + + +/* + * Decode one MCU's worth of Huffman-compressed coefficients, + * full-size blocks. + */ + +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->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 * htbl; + register int s, k, r; + int coef_limit, ci; + + /* Decode a single block's worth of coefficients */ + + /* Section F.2.2.1: decode the DC coefficient difference */ + htbl = entropy->dc_cur_tbls[blkn]; + HUFF_DECODE(s, br_state, htbl, return FALSE, label1); + + htbl = entropy->ac_cur_tbls[blkn]; + k = 1; + coef_limit = entropy->coef_limit[blkn]; + if (coef_limit) { + /* Convert DC difference to actual value, update last_dc_val */ + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + } + ci = cinfo->MCU_membership[blkn]; + s += state.last_dc_val[ci]; + state.last_dc_val[ci] = s; + /* Output the DC coefficient */ + (*block)[0] = (JCOEF) s; + + /* Section F.2.2.2: decode the AC coefficients */ + /* Since zeroes are skipped, output area must be cleared beforehand */ + for (; k < coef_limit; k++) { + HUFF_DECODE(s, br_state, htbl, 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) + goto EndOfBlock; + k += 15; + } + } + } else { + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); + } + } + + /* Section F.2.2.2: decode the AC coefficients */ + /* In this path we just discard the values */ + for (; k < DCTSIZE2; k++) { + HUFF_DECODE(s, br_state, htbl, 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; + } + } + + EndOfBlock: ; + } + + /* 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; +} + + +/* + * 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, tbl, i; + jpeg_component_info * compptr; + + if (cinfo->progressive_mode) { + /* Validate progressive scan parameters */ + if (cinfo->Ss == 0) { + if (cinfo->Se != 0) + goto bad; + } else { + /* need not check Ss/Se < 0 since they came from unsigned bytes */ + if (cinfo->Se < cinfo->Ss || cinfo->Se > cinfo->lim_Se) + goto bad; + /* AC scans may have only one component */ + if (cinfo->comps_in_scan != 1) + goto bad; + } + if (cinfo->Ah != 0) { + /* Successive approximation refinement scan: must have Al = Ah-1. */ + if (cinfo->Ah-1 != cinfo->Al) + goto bad; + } + if (cinfo->Al > 13) { /* need not check for < 0 */ + /* 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. + */ + 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 coefi, cindex = cinfo->cur_comp_info[ci]->component_index; + int *coef_bit_ptr = & cinfo->coef_bits[cindex][0]; + if (cinfo->Ss && 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 (cinfo->Ss == 0) + entropy->pub.decode_mcu = decode_mcu_DC_first; + else + entropy->pub.decode_mcu = decode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + 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 (cinfo->Ss == 0) { + 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 private state variables */ + entropy->saved.EOBRUN = 0; + } else { + /* 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->Ah != 0 || cinfo->Al != 0 || + ((cinfo->is_baseline || cinfo->Se < DCTSIZE2) && + cinfo->Se != cinfo->lim_Se)) + WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); + + /* Select MCU decoding routine */ + /* We retain the hard-coded case for full-size blocks. + * This is not necessary, but it appears that this version is slightly + * more performant in the given implementation. + * With an improved implementation we would prefer a single optimized + * function. + */ + if (cinfo->lim_Se != DCTSIZE2-1) + entropy->pub.decode_mcu = decode_mcu_sub; + else + entropy->pub.decode_mcu = decode_mcu; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Compute derived values for Huffman tables */ + /* We may do this more than once for a table, but it's not expensive */ + tbl = compptr->dc_tbl_no; + jpeg_make_d_derived_tbl(cinfo, TRUE, tbl, + & entropy->dc_derived_tbls[tbl]); + if (cinfo->lim_Se) { /* AC needs no table when not present */ + tbl = compptr->ac_tbl_no; + jpeg_make_d_derived_tbl(cinfo, FALSE, tbl, + & entropy->ac_derived_tbls[tbl]); + } + /* 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) { + ci = compptr->DCT_v_scaled_size; + i = compptr->DCT_h_scaled_size; + switch (cinfo->lim_Se) { + case (1*1-1): + entropy->coef_limit[blkn] = 1; + break; + case (2*2-1): + if (ci <= 0 || ci > 2) ci = 2; + if (i <= 0 || i > 2) i = 2; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order2[ci - 1][i - 1]; + break; + case (3*3-1): + if (ci <= 0 || ci > 3) ci = 3; + if (i <= 0 || i > 3) i = 3; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order3[ci - 1][i - 1]; + break; + case (4*4-1): + if (ci <= 0 || ci > 4) ci = 4; + if (i <= 0 || i > 4) i = 4; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order4[ci - 1][i - 1]; + break; + case (5*5-1): + if (ci <= 0 || ci > 5) ci = 5; + if (i <= 0 || i > 5) i = 5; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order5[ci - 1][i - 1]; + break; + case (6*6-1): + if (ci <= 0 || ci > 6) ci = 6; + if (i <= 0 || i > 6) i = 6; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order6[ci - 1][i - 1]; + break; + case (7*7-1): + if (ci <= 0 || ci > 7) ci = 7; + if (i <= 0 || i > 7) i = 7; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order7[ci - 1][i - 1]; + break; + default: + if (ci <= 0 || ci > 8) ci = 8; + if (i <= 0 || i > 8) i = 8; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order[ci - 1][i - 1]; + break; + } + } else { + entropy->coef_limit[blkn] = 0; + } + } + } + + /* Initialize bitread state variables */ + entropy->bitstate.bits_left = 0; + entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ + entropy->insufficient_data = FALSE; + + /* Initialize restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + +/* + * 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; + + if (cinfo->progressive_mode) { + /* Create progression status table */ + int *coef_bit_ptr, ci; + 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; + + /* Mark derived tables unallocated */ + for (i = 0; i < NUM_HUFF_TBLS; i++) { + entropy->derived_tbls[i] = NULL; + } + } else { + /* 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/jpeg-8c/jdhuff.lo b/jpeg-8c/jdhuff.lo new file mode 100644 index 00000000..b58c37b9 --- /dev/null +++ b/jpeg-8c/jdhuff.lo @@ -0,0 +1,12 @@ +# jdhuff.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdhuff.o' + +# Name of the non-PIC object +non_pic_object='jdhuff.o' + diff --git a/jpeg-8c/jdinput.c b/jpeg-8c/jdinput.c new file mode 100644 index 00000000..2c5c717b --- /dev/null +++ b/jpeg-8c/jdinput.c @@ -0,0 +1,661 @@ +/* + * jdinput.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2002-2009 by Guido Vollbeding. + * 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 jdarith.c. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private state */ + +typedef struct { + struct jpeg_input_controller pub; /* public fields */ + + int inheaders; /* Nonzero 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. + */ + + +/* + * 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. + */ + +GLOBAL(void) +jpeg_core_output_dimensions (j_decompress_ptr cinfo) +/* Do computations that are needed before master selection phase. + * This function is used for transcoding and full decompression. + */ +{ +#ifdef IDCT_SCALING_SUPPORTED + int ci; + jpeg_component_info *compptr; + + /* Compute actual output image dimensions and DCT scaling choices. */ + if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom) { + /* Provide 1/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 1; + cinfo->min_DCT_v_scaled_size = 1; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 2) { + /* Provide 2/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 2L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 2L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 2; + cinfo->min_DCT_v_scaled_size = 2; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 3) { + /* Provide 3/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 3L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 3L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 3; + cinfo->min_DCT_v_scaled_size = 3; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 4) { + /* Provide 4/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 4L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 4L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 4; + cinfo->min_DCT_v_scaled_size = 4; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 5) { + /* Provide 5/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 5L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 5L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 5; + cinfo->min_DCT_v_scaled_size = 5; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 6) { + /* Provide 6/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 6L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 6L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 6; + cinfo->min_DCT_v_scaled_size = 6; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 7) { + /* Provide 7/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 7L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 7L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 7; + cinfo->min_DCT_v_scaled_size = 7; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 8) { + /* Provide 8/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 8L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 8L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 8; + cinfo->min_DCT_v_scaled_size = 8; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 9) { + /* Provide 9/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 9L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 9L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 9; + cinfo->min_DCT_v_scaled_size = 9; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 10) { + /* Provide 10/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 10L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 10L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 10; + cinfo->min_DCT_v_scaled_size = 10; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 11) { + /* Provide 11/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 11L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 11L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 11; + cinfo->min_DCT_v_scaled_size = 11; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 12) { + /* Provide 12/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 12L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 12L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 12; + cinfo->min_DCT_v_scaled_size = 12; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 13) { + /* Provide 13/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 13L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 13L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 13; + cinfo->min_DCT_v_scaled_size = 13; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 14) { + /* Provide 14/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 14L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 14L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 14; + cinfo->min_DCT_v_scaled_size = 14; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 15) { + /* Provide 15/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 15L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 15L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 15; + cinfo->min_DCT_v_scaled_size = 15; + } else { + /* Provide 16/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 16L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 16L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 16; + cinfo->min_DCT_v_scaled_size = 16; + } + + /* Recompute dimensions of components */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size; + compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size; + } + +#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, + * and has computed unscaled downsampled_width and downsampled_height. + */ + +#endif /* IDCT_SCALING_SUPPORTED */ +} + + +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); + } + + /* Derive block_size, natural_order, and lim_Se */ + if (cinfo->is_baseline || (cinfo->progressive_mode && + cinfo->comps_in_scan)) { /* no pseudo SOS marker */ + cinfo->block_size = DCTSIZE; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + } else + switch (cinfo->Se) { + case (1*1-1): + cinfo->block_size = 1; + cinfo->natural_order = jpeg_natural_order; /* not needed */ + cinfo->lim_Se = cinfo->Se; + break; + case (2*2-1): + cinfo->block_size = 2; + cinfo->natural_order = jpeg_natural_order2; + cinfo->lim_Se = cinfo->Se; + break; + case (3*3-1): + cinfo->block_size = 3; + cinfo->natural_order = jpeg_natural_order3; + cinfo->lim_Se = cinfo->Se; + break; + case (4*4-1): + cinfo->block_size = 4; + cinfo->natural_order = jpeg_natural_order4; + cinfo->lim_Se = cinfo->Se; + break; + case (5*5-1): + cinfo->block_size = 5; + cinfo->natural_order = jpeg_natural_order5; + cinfo->lim_Se = cinfo->Se; + break; + case (6*6-1): + cinfo->block_size = 6; + cinfo->natural_order = jpeg_natural_order6; + cinfo->lim_Se = cinfo->Se; + break; + case (7*7-1): + cinfo->block_size = 7; + cinfo->natural_order = jpeg_natural_order7; + cinfo->lim_Se = cinfo->Se; + break; + case (8*8-1): + cinfo->block_size = 8; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (9*9-1): + cinfo->block_size = 9; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (10*10-1): + cinfo->block_size = 10; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (11*11-1): + cinfo->block_size = 11; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (12*12-1): + cinfo->block_size = 12; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (13*13-1): + cinfo->block_size = 13; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (14*14-1): + cinfo->block_size = 14; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (15*15-1): + cinfo->block_size = 15; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (16*16-1): + cinfo->block_size = 16; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + default: + ERREXIT4(cinfo, JERR_BAD_PROGRESSION, + cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); + break; + } + + /* We initialize DCT_scaled_size and min_DCT_scaled_size to block_size. + * In the full decompressor, + * this will be overridden by jpeg_calc_output_dimensions in jdmaster.c; + * but in the transcoder, + * jpeg_calc_output_dimensions is not used, so we must do it here. + */ + cinfo->min_DCT_h_scaled_size = cinfo->block_size; + cinfo->min_DCT_v_scaled_size = cinfo->block_size; + + /* Compute dimensions of components */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + compptr->DCT_h_scaled_size = cinfo->block_size; + compptr->DCT_v_scaled_size = cinfo->block_size; + /* 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 * cinfo->block_size)); + compptr->height_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + /* 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 * cinfo->block_size)); + + /* 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_h_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 * cinfo->block_size)); + cinfo->MCU_rows_in_scan = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + + 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_h_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. + * + * Note: This function should NOT return a pseudo SOS marker (with zero + * component number) to the caller. A pseudo marker received by + * read_markers is processed and then skipped for other 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; + + for (;;) { /* Loop to pass pseudo SOS marker */ + val = (*cinfo->marker->read_markers) (cinfo); + + switch (val) { + case JPEG_REACHED_SOS: /* Found SOS */ + if (inputctl->inheaders) { /* 1st SOS */ + if (inputctl->inheaders == 1) + initial_setup(cinfo); + if (cinfo->comps_in_scan == 0) { /* pseudo SOS marker */ + inputctl->inheaders = 2; + break; + } + inputctl->inheaders = 0; + /* 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! */ + if (cinfo->comps_in_scan == 0) /* unexpected pseudo SOS marker */ + break; + start_input_pass(cinfo); + } + return val; + 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; + } + return val; + case JPEG_SUSPENDED: + return val; + default: + 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 = 1; + /* 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 = 1; +} diff --git a/jpeg-8c/jdinput.lo b/jpeg-8c/jdinput.lo new file mode 100644 index 00000000..bf63b1c3 --- /dev/null +++ b/jpeg-8c/jdinput.lo @@ -0,0 +1,12 @@ +# jdinput.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdinput.o' + +# Name of the non-PIC object +non_pic_object='jdinput.o' + diff --git a/jpeg-8c/jdmainct.c b/jpeg-8c/jdmainct.c new file mode 100644 index 00000000..02723ca7 --- /dev/null +++ b/jpeg-8c/jdmainct.c @@ -0,0 +1,512 @@ +/* + * 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_v_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_v_scaled_size) / + cinfo->min_DCT_v_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_v_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_v_scaled_size) / + cinfo->min_DCT_v_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_v_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_v_scaled_size) / + cinfo->min_DCT_v_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_v_scaled_size; + rgroup = iMCUheight / cinfo->min_DCT_v_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_v_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_v_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_v_scaled_size + 1); + main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_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_v_scaled_size < 2) /* unsupported, see comments above */ + ERREXIT(cinfo, JERR_NOTIMPL); + alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */ + ngroups = cinfo->min_DCT_v_scaled_size + 2; + } else { + ngroups = cinfo->min_DCT_v_scaled_size; + } + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_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_h_scaled_size, + (JDIMENSION) (rgroup * ngroups)); + } +} diff --git a/jpeg-8c/jdmainct.lo b/jpeg-8c/jdmainct.lo new file mode 100644 index 00000000..8d76469d --- /dev/null +++ b/jpeg-8c/jdmainct.lo @@ -0,0 +1,12 @@ +# jdmainct.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdmainct.o' + +# Name of the non-PIC object +non_pic_object='jdmainct.o' + diff --git a/jpeg-8c/jdmarker.c b/jpeg-8c/jdmarker.c new file mode 100644 index 00000000..f2a9cc42 --- /dev/null +++ b/jpeg-8c/jdmarker.c @@ -0,0 +1,1406 @@ +/* + * jdmarker.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * 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_baseline, boolean is_prog, + boolean is_arith) +/* Process a SOFn marker */ +{ + INT32 length; + int c, ci; + jpeg_component_info * compptr; + INPUT_VARS(cinfo); + + cinfo->is_baseline = is_baseline; + 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 > MAX_COMPS_IN_SCAN || + (n == 0 && !cinfo->progressive_mode)) + /* pseudo SOS marker only allowed in progressive mode */ + 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 (non-pseudo) SOS marker */ + if (n) 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, count, i; + int n, prec; + unsigned int tmp; + JQUANT_TBL *quant_ptr; + const int *natural_order; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + while (length > 0) { + length--; + 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]; + + if (prec) { + if (length < DCTSIZE2 * 2) { + /* Initialize full table for safety. */ + for (i = 0; i < DCTSIZE2; i++) { + quant_ptr->quantval[i] = 1; + } + count = length >> 1; + } else + count = DCTSIZE2; + } else { + if (length < DCTSIZE2) { + /* Initialize full table for safety. */ + for (i = 0; i < DCTSIZE2; i++) { + quant_ptr->quantval[i] = 1; + } + count = length; + } else + count = DCTSIZE2; + } + + switch (count) { + case (2*2): natural_order = jpeg_natural_order2; break; + case (3*3): natural_order = jpeg_natural_order3; break; + case (4*4): natural_order = jpeg_natural_order4; break; + case (5*5): natural_order = jpeg_natural_order5; break; + case (6*6): natural_order = jpeg_natural_order6; break; + case (7*7): natural_order = jpeg_natural_order7; break; + default: natural_order = jpeg_natural_order; break; + } + + for (i = 0; i < count; 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[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 -= count; + if (prec) length -= count; + } + + 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. + * + * Note: This function may return a pseudo SOS marker (with zero + * component number) for treat by input controller's consume_input. + * consume_input itself should filter out (skip) the pseudo marker + * after processing for the caller. + */ + +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 */ + if (! get_sof(cinfo, TRUE, FALSE, FALSE)) + return JPEG_SUSPENDED; + break; + + case M_SOF1: /* Extended sequential, Huffman */ + if (! get_sof(cinfo, FALSE, FALSE, FALSE)) + return JPEG_SUSPENDED; + break; + + case M_SOF2: /* Progressive, Huffman */ + if (! get_sof(cinfo, FALSE, TRUE, FALSE)) + return JPEG_SUSPENDED; + break; + + case M_SOF9: /* Extended sequential, arithmetic */ + if (! get_sof(cinfo, FALSE, FALSE, TRUE)) + return JPEG_SUSPENDED; + break; + + case M_SOF10: /* Progressive, arithmetic */ + if (! get_sof(cinfo, FALSE, 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/jpeg-8c/jdmarker.lo b/jpeg-8c/jdmarker.lo new file mode 100644 index 00000000..7b072625 --- /dev/null +++ b/jpeg-8c/jdmarker.lo @@ -0,0 +1,12 @@ +# jdmarker.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdmarker.o' + +# Name of the non-PIC object +non_pic_object='jdmarker.o' + diff --git a/jpeg-8c/jdmaster.c b/jpeg-8c/jdmaster.c new file mode 100644 index 00000000..8c1146e4 --- /dev/null +++ b/jpeg-8c/jdmaster.c @@ -0,0 +1,533 @@ +/* + * jdmaster.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2002-2009 by Guido Vollbeding. + * 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_h_scaled_size != cinfo->min_DCT_h_scaled_size || + cinfo->comp_info[1].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size || + cinfo->comp_info[2].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size || + cinfo->comp_info[0].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size || + cinfo->comp_info[1].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size || + cinfo->comp_info[2].DCT_v_scaled_size != cinfo->min_DCT_v_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. + * This function is used for full decompression. + */ +{ +#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); + + /* Compute core output image dimensions and DCT scaling choices. */ + jpeg_core_output_dimensions(cinfo); + +#ifdef IDCT_SCALING_SUPPORTED + + /* 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 adapts subsampling ratios which are powers of 2. + */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + int ssize = 1; + while (cinfo->min_DCT_h_scaled_size * ssize <= + (cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) { + ssize = ssize * 2; + } + compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize; + ssize = 1; + while (cinfo->min_DCT_v_scaled_size * ssize <= + (cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) { + ssize = ssize * 2; + } + compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize; + + /* We don't support IDCT ratios larger than 2. */ + if (compptr->DCT_h_scaled_size > compptr->DCT_v_scaled_size * 2) + compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2; + else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2) + compptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2; + } + + /* 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_h_scaled_size), + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + compptr->downsampled_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * + (long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size), + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + } + +#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) + jinit_arith_decoder(cinfo); + 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/jpeg-8c/jdmaster.lo b/jpeg-8c/jdmaster.lo new file mode 100644 index 00000000..343fc47a --- /dev/null +++ b/jpeg-8c/jdmaster.lo @@ -0,0 +1,12 @@ +# jdmaster.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdmaster.o' + +# Name of the non-PIC object +non_pic_object='jdmaster.o' + diff --git a/jpeg-8c/jdmerge.c b/jpeg-8c/jdmerge.c new file mode 100644 index 00000000..37444468 --- /dev/null +++ b/jpeg-8c/jdmerge.c @@ -0,0 +1,400 @@ +/* + * 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/jpeg-8c/jdmerge.lo b/jpeg-8c/jdmerge.lo new file mode 100644 index 00000000..c056f110 --- /dev/null +++ b/jpeg-8c/jdmerge.lo @@ -0,0 +1,12 @@ +# jdmerge.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdmerge.o' + +# Name of the non-PIC object +non_pic_object='jdmerge.o' + diff --git a/jpeg-8c/jdpostct.c b/jpeg-8c/jdpostct.c new file mode 100644 index 00000000..571563d7 --- /dev/null +++ b/jpeg-8c/jdpostct.c @@ -0,0 +1,290 @@ +/* + * 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/jpeg-8c/jdpostct.lo b/jpeg-8c/jdpostct.lo new file mode 100644 index 00000000..80ea2805 --- /dev/null +++ b/jpeg-8c/jdpostct.lo @@ -0,0 +1,12 @@ +# jdpostct.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdpostct.o' + +# Name of the non-PIC object +non_pic_object='jdpostct.o' + diff --git a/jpeg-8c/jdsample.c b/jpeg-8c/jdsample.c new file mode 100644 index 00000000..7bc8885b --- /dev/null +++ b/jpeg-8c/jdsample.c @@ -0,0 +1,361 @@ +/* + * jdsample.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * Modified 2002-2008 by Guido Vollbeding. + * 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_v_scaled_size / min_DCT_v_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 outrow; + + for (outrow = 0; outrow < cinfo->max_v_samp_factor; outrow++) { + inptr = input_data[outrow]; + outptr = output_data[outrow]; + 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; + } +} + + +/* + * 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; + 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); + + /* 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_h_scaled_size) / + cinfo->min_DCT_h_scaled_size; + v_in_group = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_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 case for 2h1v upsampling */ + upsample->methods[ci] = h2v1_upsample; + } else if (h_in_group * 2 == h_out_group && + v_in_group * 2 == v_out_group) { + /* Special case for 2h2v upsampling */ + 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/jpeg-8c/jdsample.lo b/jpeg-8c/jdsample.lo new file mode 100644 index 00000000..039d3faf --- /dev/null +++ b/jpeg-8c/jdsample.lo @@ -0,0 +1,12 @@ +# jdsample.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdsample.o' + +# Name of the non-PIC object +non_pic_object='jdsample.o' + diff --git a/jpeg-8c/jdtrans.c b/jpeg-8c/jdtrans.c new file mode 100644 index 00000000..22dd47fb --- /dev/null +++ b/jpeg-8c/jdtrans.c @@ -0,0 +1,140 @@ +/* + * jdtrans.c + * + * Copyright (C) 1995-1997, Thomas G. Lane. + * Modified 2000-2009 by Guido Vollbeding. + * 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; + + /* Compute output image dimensions and related values. */ + jpeg_core_output_dimensions(cinfo); + + /* Entropy decoding: either Huffman or arithmetic coding. */ + if (cinfo->arith_code) + jinit_arith_decoder(cinfo); + 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/jpeg-8c/jdtrans.lo b/jpeg-8c/jdtrans.lo new file mode 100644 index 00000000..f0d7b50c --- /dev/null +++ b/jpeg-8c/jdtrans.lo @@ -0,0 +1,12 @@ +# jdtrans.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jdtrans.o' + +# Name of the non-PIC object +non_pic_object='jdtrans.o' + diff --git a/jpeg-8c/jerror.c b/jpeg-8c/jerror.c new file mode 100644 index 00000000..3da7be86 --- /dev/null +++ b/jpeg-8c/jerror.c @@ -0,0 +1,252 @@ +/* + * 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/jpeg-8c/jerror.h b/jpeg-8c/jerror.h new file mode 100644 index 00000000..1cfb2b19 --- /dev/null +++ b/jpeg-8c/jerror.h @@ -0,0 +1,304 @@ +/* + * jerror.h + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * Modified 1997-2009 by Guido Vollbeding. + * 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 JPEG library. + * Edit this file to add new codes, or to translate the message strings to + * some other language. + * A set of error-reporting macros are defined too. Some applications using + * the JPEG library may wish to include this file to get the error codes + * and/or the macros. + */ + +/* + * 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 JERROR_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 /* JERROR_H */ +#endif /* JMESSAGE */ + +#ifdef JMAKE_ENUM_LIST + +typedef enum { + +#define JMESSAGE(code,string) code , + +#endif /* JMAKE_ENUM_LIST */ + +JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */ + +/* For maintenance convenience, list is alphabetical by message code name */ +JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix") +JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix") +JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode") +JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS") +JMESSAGE(JERR_BAD_CROP_SPEC, "Invalid crop request") +JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range") +JMESSAGE(JERR_BAD_DCTSIZE, "DCT scaled block size %dx%d not supported") +JMESSAGE(JERR_BAD_DROP_SAMPLING, + "Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c") +JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition") +JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace") +JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace") +JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length") +JMESSAGE(JERR_BAD_LIB_VERSION, + "Wrong JPEG library version: library is %d, caller expects %d") +JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan") +JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d") +JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d") +JMESSAGE(JERR_BAD_PROGRESSION, + "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") +JMESSAGE(JERR_BAD_PROG_SCRIPT, + "Invalid progressive parameters at scan script entry %d") +JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors") +JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d") +JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d") +JMESSAGE(JERR_BAD_STRUCT_SIZE, + "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") +JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") +JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small") +JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here") +JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") +JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") +JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request") +JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") +JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") +JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") +JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d") +JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)") +JMESSAGE(JERR_EMS_READ, "Read from EMS failed") +JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") +JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan") +JMESSAGE(JERR_FILE_READ, "Input file read error") +JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?") +JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet") +JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") +JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") +JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels") +JMESSAGE(JERR_INPUT_EMPTY, "Empty input file") +JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") +JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, + "Cannot transcode due to multiple use of quantization table %d") +JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data") +JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change") +JMESSAGE(JERR_NOTIMPL, "Not implemented yet") +JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time") +JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined") +JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") +JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") +JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") +JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined") +JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x") +JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)") +JMESSAGE(JERR_QUANT_COMPONENTS, + "Cannot quantize more than %d color components") +JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") +JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") +JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") +JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker") +JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") +JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") +JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF") +JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") +JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") +JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file") +JMESSAGE(JERR_TFILE_WRITE, + "Write failed on temporary file --- out of disk space?") +JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") +JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x") +JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") +JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation") +JMESSAGE(JERR_XMS_READ, "Read from XMS failed") +JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed") +JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT) +JMESSAGE(JMSG_VERSION, JVERSION) +JMESSAGE(JTRC_16BIT_TABLES, + "Caution: quantization tables are too coarse for baseline JPEG") +JMESSAGE(JTRC_ADOBE, + "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") +JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") +JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") +JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") +JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") +JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d") +JMESSAGE(JTRC_DRI, "Define Restart Interval %u") +JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") +JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") +JMESSAGE(JTRC_EOI, "End Of Image") +JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") +JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") +JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, + "Warning: thumbnail image size does not match data length %u") +JMESSAGE(JTRC_JFIF_EXTENSION, + "JFIF extension marker: type 0x%02x, length %u") +JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image") +JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u") +JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") +JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u") +JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") +JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") +JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") +JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") +JMESSAGE(JTRC_RST, "RST%d") +JMESSAGE(JTRC_SMOOTH_NOTIMPL, + "Smoothing not supported with nonstandard sampling ratios") +JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") +JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d") +JMESSAGE(JTRC_SOI, "Start of Image") +JMESSAGE(JTRC_SOS, "Start Of Scan: %d components") +JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d") +JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") +JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") +JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s") +JMESSAGE(JTRC_THUMB_JPEG, + "JFIF extension marker: JPEG-compressed thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_PALETTE, + "JFIF extension marker: palette thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_RGB, + "JFIF extension marker: RGB thumbnail image, length %u") +JMESSAGE(JTRC_UNKNOWN_IDS, + "Unrecognized component IDs %d %d %d, assuming YCbCr") +JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") +JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u") +JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d") +JMESSAGE(JWRN_ARITH_BAD_CODE, "Corrupt JPEG data: bad arithmetic code") +JMESSAGE(JWRN_BOGUS_PROGRESSION, + "Inconsistent progression sequence for component %d coefficient %d") +JMESSAGE(JWRN_EXTRANEOUS_DATA, + "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x") +JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment") +JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code") +JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d") +JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file") +JMESSAGE(JWRN_MUST_RESYNC, + "Corrupt JPEG data: found marker 0x%02x instead of RST%d") +JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG") +JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines") + +#ifdef JMAKE_ENUM_LIST + + JMSG_LASTMSGCODE +} J_MESSAGE_CODE; + +#undef JMAKE_ENUM_LIST +#endif /* JMAKE_ENUM_LIST */ + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ +#undef JMESSAGE + + +#ifndef JERROR_H +#define JERROR_H + +/* Macros to simplify using the error and trace message stuff */ +/* The first parameter is either type of cinfo pointer */ + +/* Fatal errors (print message and exit) */ +#define ERREXIT(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT3(cinfo,code,p1,p2,p3) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT6(cinfo,code,p1,p2,p3,p4,p5,p6) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (cinfo)->err->msg_parm.i[4] = (p5), \ + (cinfo)->err->msg_parm.i[5] = (p6), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXITS(cinfo,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) + +#define MAKESTMT(stuff) do { stuff } while (0) + +/* Nonfatal errors (we can keep going, but the data is probably corrupt) */ +#define WARNMS(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) + +/* Informational/debugging messages */ +#define TRACEMS(cinfo,lvl,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS1(cinfo,lvl,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS2(cinfo,lvl,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMSS(cinfo,lvl,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) + +#endif /* JERROR_H */ diff --git a/jpeg-8c/jerror.lo b/jpeg-8c/jerror.lo new file mode 100644 index 00000000..b0fecf9d --- /dev/null +++ b/jpeg-8c/jerror.lo @@ -0,0 +1,12 @@ +# jerror.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jerror.o' + +# Name of the non-PIC object +non_pic_object='jerror.o' + diff --git a/jpeg-8c/jfdctflt.c b/jpeg-8c/jfdctflt.c new file mode 100644 index 00000000..74d0d862 --- /dev/null +++ b/jpeg-8c/jfdctflt.c @@ -0,0 +1,174 @@ +/* + * jfdctflt.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2003-2009 by Guido Vollbeding. + * 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, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + 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; + JSAMPROW elemptr; + int ctr; + + /* Pass 1: process rows. */ + + dataptr = data; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Load data into workspace */ + tmp0 = (FAST_FLOAT) (GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7])); + tmp7 = (FAST_FLOAT) (GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7])); + tmp1 = (FAST_FLOAT) (GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6])); + tmp6 = (FAST_FLOAT) (GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6])); + tmp2 = (FAST_FLOAT) (GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5])); + tmp5 = (FAST_FLOAT) (GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5])); + tmp3 = (FAST_FLOAT) (GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4])); + tmp4 = (FAST_FLOAT) (GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4])); + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + /* Apply unsigned->signed conversion */ + dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE; /* 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/jpeg-8c/jfdctflt.lo b/jpeg-8c/jfdctflt.lo new file mode 100644 index 00000000..fce2120b --- /dev/null +++ b/jpeg-8c/jfdctflt.lo @@ -0,0 +1,12 @@ +# jfdctflt.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jfdctflt.o' + +# Name of the non-PIC object +non_pic_object='jfdctflt.o' + diff --git a/jpeg-8c/jfdctfst.c b/jpeg-8c/jfdctfst.c new file mode 100644 index 00000000..8cad5f22 --- /dev/null +++ b/jpeg-8c/jfdctfst.c @@ -0,0 +1,230 @@ +/* + * jfdctfst.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2003-2009 by Guido Vollbeding. + * 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, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + DCTELEM tmp10, tmp11, tmp12, tmp13; + DCTELEM z1, z2, z3, z4, z5, z11, z13; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + + dataptr = data; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Load data into workspace */ + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp7 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp6 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp5 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + tmp4 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + /* Apply unsigned->signed conversion */ + dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE; /* 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/jpeg-8c/jfdctfst.lo b/jpeg-8c/jfdctfst.lo new file mode 100644 index 00000000..a1b9a7eb --- /dev/null +++ b/jpeg-8c/jfdctfst.lo @@ -0,0 +1,12 @@ +# jfdctfst.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jfdctfst.o' + +# Name of the non-PIC object +non_pic_object='jfdctfst.o' + diff --git a/jpeg-8c/jfdctint.c b/jpeg-8c/jfdctint.c new file mode 100644 index 00000000..1dde58c4 --- /dev/null +++ b/jpeg-8c/jfdctint.c @@ -0,0 +1,4348 @@ +/* + * jfdctint.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * Modification developed 2003-2009 by Guido Vollbeding. + * 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. + * + * We also provide FDCT routines with various input sample block sizes for + * direct resolution reduction or enlargement and for direct resolving the + * common 2x1 and 1x2 subsampling cases without additional resampling: NxN + * (N=1...16), 2NxN, and Nx2N (N=1...8) pixels for one 8x8 output DCT block. + * + * For N<8 we fill the remaining block coefficients with zero. + * For N>8 we apply a partial N-point FDCT on the input samples, computing + * just the lower 8 frequency coefficients and discarding the rest. + * + * We must scale the output coefficients of the N-point FDCT appropriately + * to the standard 8-point FDCT level by 8/N per 1-D pass. This scaling + * is folded into the constant multipliers (pass 2) and/or final/initial + * shifting. + * + * CAUTION: We rely on the FIX() macro except for the N=1,2,4,8 cases + * since there would be too many additional constants to pre-calculate. + */ + +#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 DCT blocks. /* 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, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1; + DCTELEM *dataptr; + JSAMPROW elemptr; + 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 = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + + tmp10 = tmp0 + tmp3; + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS-PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, 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--) { + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + + /* Add fudge factor here for final descale. */ + tmp10 = tmp0 + tmp3 + (ONE << (PASS1_BITS-1)); + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + dataptr[DCTSIZE*2] = (DCTELEM) + RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + +#ifdef DCT_SCALING_SUPPORTED + + +/* + * Perform the forward DCT on a 7x7 sample block. + */ + +GLOBAL(void) +jpeg_fdct_7x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* 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. */ + /* cK represents sqrt(2) * cos(K*pi/14). */ + + dataptr = data; + for (ctr = 0; ctr < 7; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[6]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[5]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[4]); + tmp3 = GETJSAMPLE(elemptr[3]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[6]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[5]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[4]); + + z1 = tmp0 + tmp2; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((z1 + tmp1 + tmp3 - 7 * CENTERJSAMPLE) << PASS1_BITS); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.353553391)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(0.920609002)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.314692123)); /* c6 */ + dataptr[2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS-PASS1_BITS); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.881747734)); /* c4 */ + dataptr[4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.707106781)), /* c2+c6-c4 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.613604268)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(1.870828693)); /* c3+c1-c5 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, 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. + * We must also scale the output by (8/7)**2 = 64/49, which we fold + * into the constant multipliers: + * cK now represents sqrt(2) * cos(K*pi/14) * 64/49. + */ + + dataptr = data; + for (ctr = 0; ctr < 7; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*6]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*5]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*4]; + tmp3 = dataptr[DCTSIZE*3]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*6]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*5]; + tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*4]; + + z1 = tmp0 + tmp2; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + tmp1 + tmp3, FIX(1.306122449)), /* 64/49 */ + CONST_BITS+PASS1_BITS); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.461784020)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(1.202428084)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.411026446)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS+PASS1_BITS); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(1.151670509)); /* c4 */ + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.923568041)), /* c2+c6-c4 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.221765677)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.222383464)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.800824523)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.801442310)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(2.443531355)); /* c3+c1-c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 6x6 sample block. + */ + +GLOBAL(void) +jpeg_fdct_6x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11, tmp12; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* 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. */ + /* cK represents sqrt(2) * cos(K*pi/12). */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]); + tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(1.224744871)), /* c2 */ + CONST_BITS-PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)), /* c4 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)), /* c5 */ + CONST_BITS-PASS1_BITS); + + dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << PASS1_BITS)); + dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << PASS1_BITS); + dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << 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. + * We must also scale the output by (8/6)**2 = 16/9, which we fold + * into the constant multipliers: + * cK now represents sqrt(2) * cos(K*pi/12) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5]; + tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3]; + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(2.177324216)), /* c2 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)), /* c4 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829)); /* c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 5x5 sample block. + */ + +GLOBAL(void) +jpeg_fdct_5x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* 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. */ + /* We scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/10). */ + + dataptr = data; + for (ctr = 0; ctr < 5; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[3]); + tmp2 = GETJSAMPLE(elemptr[2]); + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp2 - 5 * CENTERJSAMPLE) << (PASS1_BITS+1)); + tmp11 = MULTIPLY(tmp11, FIX(0.790569415)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.353553391)); /* (c2-c4)/2 */ + dataptr[2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS-PASS1_BITS-1); + dataptr[4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS-PASS1_BITS-1); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(0.831253876)); /* c3 */ + + dataptr[1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.513743148)), /* c1-c3 */ + CONST_BITS-PASS1_BITS-1); + dataptr[3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.176250899)), /* c1+c3 */ + CONST_BITS-PASS1_BITS-1); + + 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. + * We must also scale the output by (8/5)**2 = 64/25, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * cK now represents sqrt(2) * cos(K*pi/10) * 32/25. + */ + + dataptr = data; + for (ctr = 0; ctr < 5; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*3]; + tmp2 = dataptr[DCTSIZE*2]; + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp11 = MULTIPLY(tmp11, FIX(1.011928851)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.452548340)); /* (c2-c4)/2 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(1.064004961)); /* c3 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.657591230)), /* c1-c3 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.785601151)), /* c1+c3 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 4x4 sample block. + */ + +GLOBAL(void) +jpeg_fdct_4x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* 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. */ + /* We must also scale the output by (8/4)**2 = 2**2, which we add here. */ + /* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+2)); + dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+2)); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-3); + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS-2); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS-2); + + 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 = 0; ctr < 4; ctr++) { + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3] + (ONE << (PASS1_BITS-1)); + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS+PASS1_BITS-1); + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 3x3 sample block. + */ + +GLOBAL(void) +jpeg_fdct_3x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* 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. */ + /* We scale the results further by 2**2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/6). */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[2]); + tmp1 = GETJSAMPLE(elemptr[1]); + + tmp2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 3 * CENTERJSAMPLE) << (PASS1_BITS+2)); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(0.707106781)), /* c2 */ + CONST_BITS-PASS1_BITS-2); + + /* Odd part */ + + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(1.224744871)), /* c1 */ + CONST_BITS-PASS1_BITS-2); + + 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. + * We must also scale the output by (8/3)**2 = 64/9, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * cK now represents sqrt(2) * cos(K*pi/6) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*2]; + tmp1 = dataptr[DCTSIZE*1]; + + tmp2 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(1.257078722)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(2.177324216)), /* c1 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 2x2 sample block. + */ + +GLOBAL(void) +jpeg_fdct_2x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + JSAMPROW elemptr; + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + + /* Row 0 */ + elemptr = sample_data[0] + start_col; + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[1]); + tmp1 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[1]); + + /* Row 1 */ + elemptr = sample_data[1] + start_col; + + tmp2 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[1]); + tmp3 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[1]); + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/2)**2 = 2**4. + */ + + /* Column 0 */ + /* Apply unsigned->signed conversion */ + data[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp2 - 4 * CENTERJSAMPLE) << 4); + data[DCTSIZE*1] = (DCTELEM) ((tmp0 - tmp2) << 4); + + /* Column 1 */ + data[DCTSIZE*0+1] = (DCTELEM) ((tmp1 + tmp3) << 4); + data[DCTSIZE*1+1] = (DCTELEM) ((tmp1 - tmp3) << 4); +} + + +/* + * Perform the forward DCT on a 1x1 sample block. + */ + +GLOBAL(void) +jpeg_fdct_1x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* We leave the result scaled up by an overall factor of 8. */ + /* We must also scale the output by (8/1)**2 = 2**6. */ + /* Apply unsigned->signed conversion */ + data[0] = (DCTELEM) + ((GETJSAMPLE(sample_data[0][start_col]) - CENTERJSAMPLE) << 6); +} + + +/* + * Perform the forward DCT on a 9x9 sample block. + */ + +GLOBAL(void) +jpeg_fdct_9x9 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2; + DCTELEM workspace[8]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* we scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/18). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[8]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[7]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[6]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[5]); + tmp4 = GETJSAMPLE(elemptr[4]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[8]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[7]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[6]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[5]); + + z1 = tmp0 + tmp2 + tmp3; + z2 = tmp1 + tmp4; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((z1 + z2 - 9 * CENTERJSAMPLE) << 1); + dataptr[6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z2 - z2, FIX(0.707106781)), /* c6 */ + CONST_BITS-1); + z1 = MULTIPLY(tmp0 - tmp2, FIX(1.328926049)); /* c2 */ + z2 = MULTIPLY(tmp1 - tmp4 - tmp4, FIX(0.707106781)); /* c6 */ + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp2 - tmp3, FIX(1.083350441)) /* c4 */ + + z1 + z2, CONST_BITS-1); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp3 - tmp0, FIX(0.245575608)) /* c8 */ + + z1 - z2, CONST_BITS-1); + + /* Odd part */ + + dataptr[3] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12 - tmp13, FIX(1.224744871)), /* c3 */ + CONST_BITS-1); + + tmp11 = MULTIPLY(tmp11, FIX(1.224744871)); /* c3 */ + tmp0 = MULTIPLY(tmp10 + tmp12, FIX(0.909038955)); /* c5 */ + tmp1 = MULTIPLY(tmp10 + tmp13, FIX(0.483689525)); /* c7 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp11 + tmp0 + tmp1, CONST_BITS-1); + + tmp2 = MULTIPLY(tmp12 - tmp13, FIX(1.392728481)); /* c1 */ + + dataptr[5] = (DCTELEM) DESCALE(tmp0 - tmp11 - tmp2, CONST_BITS-1); + dataptr[7] = (DCTELEM) DESCALE(tmp1 - tmp11 + tmp2, CONST_BITS-1); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 9) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/9)**2 = 64/81, which we partially + * fold into the constant multipliers and final/initial shifting: + * cK now represents sqrt(2) * cos(K*pi/18) * 128/81. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*0]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*7]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*6]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*5]; + tmp4 = dataptr[DCTSIZE*4]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*0]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*7]; + tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*6]; + tmp13 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*5]; + + z1 = tmp0 + tmp2 + tmp3; + z2 = tmp1 + tmp4; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + z2, FIX(1.580246914)), /* 128/81 */ + CONST_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z2 - z2, FIX(1.117403309)), /* c6 */ + CONST_BITS+2); + z1 = MULTIPLY(tmp0 - tmp2, FIX(2.100031287)); /* c2 */ + z2 = MULTIPLY(tmp1 - tmp4 - tmp4, FIX(1.117403309)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp2 - tmp3, FIX(1.711961190)) /* c4 */ + + z1 + z2, CONST_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp3 - tmp0, FIX(0.388070096)) /* c8 */ + + z1 - z2, CONST_BITS+2); + + /* Odd part */ + + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12 - tmp13, FIX(1.935399303)), /* c3 */ + CONST_BITS+2); + + tmp11 = MULTIPLY(tmp11, FIX(1.935399303)); /* c3 */ + tmp0 = MULTIPLY(tmp10 + tmp12, FIX(1.436506004)); /* c5 */ + tmp1 = MULTIPLY(tmp10 + tmp13, FIX(0.764348879)); /* c7 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp11 + tmp0 + tmp1, CONST_BITS+2); + + tmp2 = MULTIPLY(tmp12 - tmp13, FIX(2.200854883)); /* c1 */ + + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp0 - tmp11 - tmp2, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) + DESCALE(tmp1 - tmp11 + tmp2, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 10x10 sample block. + */ + +GLOBAL(void) +jpeg_fdct_10x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + DCTELEM workspace[8*2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* we scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/20). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[8]); + tmp12 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[5]); + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[8]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[5]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 - 10 * CENTERJSAMPLE) << 1); + tmp12 += tmp12; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.144122806)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.437016024)), /* c8 */ + CONST_BITS-1); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(0.831253876)); /* c6 */ + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.513743148)), /* c2-c6 */ + CONST_BITS-1); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.176250899)), /* c2+c6 */ + CONST_BITS-1); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[5] = (DCTELEM) ((tmp10 - tmp11 - tmp2) << 1); + tmp2 <<= CONST_BITS; + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.396802247)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.260073511)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.642039522)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.221231742)), /* c9 */ + CONST_BITS-1); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(0.951056516)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.587785252)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.309016994)) + /* (c3-c7)/2 */ + (tmp11 << (CONST_BITS - 1)) - tmp2; + dataptr[3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS-1); + dataptr[7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS-1); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 10) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/10)**2 = 16/25, which we partially + * fold into the constant multipliers and final/initial shifting: + * cK now represents sqrt(2) * cos(K*pi/20) * 32/25. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*0]; + tmp12 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5]; + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*0]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(1.28)), /* 32/25 */ + CONST_BITS+2); + tmp12 += tmp12; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.464477191)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.559380511)), /* c8 */ + CONST_BITS+2); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(1.064004961)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.657591230)), /* c2-c6 */ + CONST_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.785601151)), /* c2+c6 */ + CONST_BITS+2); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+2); + tmp2 = MULTIPLY(tmp2, FIX(1.28)); /* 32/25 */ + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.787906876)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.612894094)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.821810588)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.283176630)), /* c9 */ + CONST_BITS+2); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(1.217352341)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.752365123)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.395541753)) + /* (c3-c7)/2 */ + MULTIPLY(tmp11, FIX(0.64)) - tmp2; /* 16/25 */ + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on an 11x11 sample block. + */ + +GLOBAL(void) +jpeg_fdct_11x11 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 z1, z2, z3; + DCTELEM workspace[8*3]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* we scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/22). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[10]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[9]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[8]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[7]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[6]); + tmp5 = GETJSAMPLE(elemptr[5]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[10]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[9]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[8]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[7]); + tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[6]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 - 11 * CENTERJSAMPLE) << 1); + tmp5 += tmp5; + tmp0 -= tmp5; + tmp1 -= tmp5; + tmp2 -= tmp5; + tmp3 -= tmp5; + tmp4 -= tmp5; + z1 = MULTIPLY(tmp0 + tmp3, FIX(1.356927976)) + /* c2 */ + MULTIPLY(tmp2 + tmp4, FIX(0.201263574)); /* c10 */ + z2 = MULTIPLY(tmp1 - tmp3, FIX(0.926112931)); /* c6 */ + z3 = MULTIPLY(tmp0 - tmp1, FIX(1.189712156)); /* c4 */ + dataptr[2] = (DCTELEM) + DESCALE(z1 + z2 - MULTIPLY(tmp3, FIX(1.018300590)) /* c2+c8-c6 */ + - MULTIPLY(tmp4, FIX(1.390975730)), /* c4+c10 */ + CONST_BITS-1); + dataptr[4] = (DCTELEM) + DESCALE(z2 + z3 + MULTIPLY(tmp1, FIX(0.062335650)) /* c4-c6-c10 */ + - MULTIPLY(tmp2, FIX(1.356927976)) /* c2 */ + + MULTIPLY(tmp4, FIX(0.587485545)), /* c8 */ + CONST_BITS-1); + dataptr[6] = (DCTELEM) + DESCALE(z1 + z3 - MULTIPLY(tmp0, FIX(1.620527200)) /* c2+c4-c6 */ + - MULTIPLY(tmp2, FIX(0.788749120)), /* c8+c10 */ + CONST_BITS-1); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.286413905)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.068791298)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.764581576)); /* c7 */ + tmp0 = tmp1 + tmp2 + tmp3 - MULTIPLY(tmp10, FIX(1.719967871)) /* c7+c5+c3-c1 */ + + MULTIPLY(tmp14, FIX(0.398430003)); /* c9 */ + tmp4 = MULTIPLY(tmp11 + tmp12, - FIX(0.764581576)); /* -c7 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.399818907)); /* -c1 */ + tmp1 += tmp4 + tmp5 + MULTIPLY(tmp11, FIX(1.276416582)) /* c9+c7+c1-c3 */ + - MULTIPLY(tmp14, FIX(1.068791298)); /* c5 */ + tmp10 = MULTIPLY(tmp12 + tmp13, FIX(0.398430003)); /* c9 */ + tmp2 += tmp4 + tmp10 - MULTIPLY(tmp12, FIX(1.989053629)) /* c9+c5+c3-c7 */ + + MULTIPLY(tmp14, FIX(1.399818907)); /* c1 */ + tmp3 += tmp5 + tmp10 + MULTIPLY(tmp13, FIX(1.305598626)) /* c1+c5-c9-c7 */ + - MULTIPLY(tmp14, FIX(1.286413905)); /* c3 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-1); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-1); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-1); + dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS-1); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 11) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/11)**2 = 64/121, which we partially + * fold into the constant multipliers and final/initial shifting: + * cK now represents sqrt(2) * cos(K*pi/22) * 128/121. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*2]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*1]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*0]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*7]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*6]; + tmp5 = dataptr[DCTSIZE*5]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*2]; + tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*1]; + tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*0]; + tmp13 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*7]; + tmp14 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*6]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5, + FIX(1.057851240)), /* 128/121 */ + CONST_BITS+2); + tmp5 += tmp5; + tmp0 -= tmp5; + tmp1 -= tmp5; + tmp2 -= tmp5; + tmp3 -= tmp5; + tmp4 -= tmp5; + z1 = MULTIPLY(tmp0 + tmp3, FIX(1.435427942)) + /* c2 */ + MULTIPLY(tmp2 + tmp4, FIX(0.212906922)); /* c10 */ + z2 = MULTIPLY(tmp1 - tmp3, FIX(0.979689713)); /* c6 */ + z3 = MULTIPLY(tmp0 - tmp1, FIX(1.258538479)); /* c4 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(z1 + z2 - MULTIPLY(tmp3, FIX(1.077210542)) /* c2+c8-c6 */ + - MULTIPLY(tmp4, FIX(1.471445400)), /* c4+c10 */ + CONST_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(z2 + z3 + MULTIPLY(tmp1, FIX(0.065941844)) /* c4-c6-c10 */ + - MULTIPLY(tmp2, FIX(1.435427942)) /* c2 */ + + MULTIPLY(tmp4, FIX(0.621472312)), /* c8 */ + CONST_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(z1 + z3 - MULTIPLY(tmp0, FIX(1.714276708)) /* c2+c4-c6 */ + - MULTIPLY(tmp2, FIX(0.834379234)), /* c8+c10 */ + CONST_BITS+2); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.360834544)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.130622199)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.808813568)); /* c7 */ + tmp0 = tmp1 + tmp2 + tmp3 - MULTIPLY(tmp10, FIX(1.819470145)) /* c7+c5+c3-c1 */ + + MULTIPLY(tmp14, FIX(0.421479672)); /* c9 */ + tmp4 = MULTIPLY(tmp11 + tmp12, - FIX(0.808813568)); /* -c7 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.480800167)); /* -c1 */ + tmp1 += tmp4 + tmp5 + MULTIPLY(tmp11, FIX(1.350258864)) /* c9+c7+c1-c3 */ + - MULTIPLY(tmp14, FIX(1.130622199)); /* c5 */ + tmp10 = MULTIPLY(tmp12 + tmp13, FIX(0.421479672)); /* c9 */ + tmp2 += tmp4 + tmp10 - MULTIPLY(tmp12, FIX(2.104122847)) /* c9+c5+c3-c7 */ + + MULTIPLY(tmp14, FIX(1.480800167)); /* c1 */ + tmp3 += tmp5 + tmp10 + MULTIPLY(tmp13, FIX(1.381129125)) /* c1+c5-c9-c7 */ + - MULTIPLY(tmp14, FIX(1.360834544)); /* c3 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+2); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+2); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 12x12 sample block. + */ + +GLOBAL(void) +jpeg_fdct_12x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + DCTELEM workspace[8*4]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/24). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[6]); + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[6]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) (tmp10 + tmp11 + tmp12 - 12 * CENTERJSAMPLE); + dataptr[6] = (DCTELEM) (tmp13 - tmp14 - tmp15); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.224744871)), /* c4 */ + CONST_BITS); + dataptr[2] = (DCTELEM) + DESCALE(tmp14 - tmp15 + MULTIPLY(tmp13 + tmp15, FIX(1.366025404)), /* c2 */ + CONST_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX_0_541196100); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX_0_765366865); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX_1_847759065); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.121971054)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.860918669)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.580774953)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.184591911)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.184591911)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.339493912)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.860918669)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.725788011)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(1.121971054)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.306562965)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX_0_541196100); /* c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 12) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/12)**2 = 4/9, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/24) * 8/9. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*6]; + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*6]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(tmp13 - tmp14 - tmp15, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.088662108)), /* c4 */ + CONST_BITS+1); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp14 - tmp15, FIX(0.888888889)) + /* 8/9 */ + MULTIPLY(tmp13 + tmp15, FIX(1.214244803)), /* c2 */ + CONST_BITS+1); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX(0.481063200)); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX(0.680326102)); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX(1.642452502)); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(0.997307603)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.765261039)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.516244403)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.164081699)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.164081699)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.079550144)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.765261039)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.645144899)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(0.997307603)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.161389302)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX(0.481063200)); /* c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 13x13 sample block. + */ + +GLOBAL(void) +jpeg_fdct_13x13 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 z1, z2; + DCTELEM workspace[8*5]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/26). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[12]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[11]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[10]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[9]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[8]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[7]); + tmp6 = GETJSAMPLE(elemptr[6]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[12]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[11]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[10]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[9]); + tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[8]); + tmp15 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[7]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + (tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6 - 13 * CENTERJSAMPLE); + tmp6 += tmp6; + tmp0 -= tmp6; + tmp1 -= tmp6; + tmp2 -= tmp6; + tmp3 -= tmp6; + tmp4 -= tmp6; + tmp5 -= tmp6; + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.373119086)) + /* c2 */ + MULTIPLY(tmp1, FIX(1.058554052)) + /* c6 */ + MULTIPLY(tmp2, FIX(0.501487041)) - /* c10 */ + MULTIPLY(tmp3, FIX(0.170464608)) - /* c12 */ + MULTIPLY(tmp4, FIX(0.803364869)) - /* c8 */ + MULTIPLY(tmp5, FIX(1.252223920)), /* c4 */ + CONST_BITS); + z1 = MULTIPLY(tmp0 - tmp2, FIX(1.155388986)) - /* (c4+c6)/2 */ + MULTIPLY(tmp3 - tmp4, FIX(0.435816023)) - /* (c2-c10)/2 */ + MULTIPLY(tmp1 - tmp5, FIX(0.316450131)); /* (c8-c12)/2 */ + z2 = MULTIPLY(tmp0 + tmp2, FIX(0.096834934)) - /* (c4-c6)/2 */ + MULTIPLY(tmp3 + tmp4, FIX(0.937303064)) + /* (c2+c10)/2 */ + MULTIPLY(tmp1 + tmp5, FIX(0.486914739)); /* (c8+c12)/2 */ + + dataptr[4] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 - z2, CONST_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.322312651)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.163874945)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.937797057)) + /* c7 */ + MULTIPLY(tmp14 + tmp15, FIX(0.338443458)); /* c11 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(tmp10, FIX(2.020082300)) + /* c3+c5+c7-c1 */ + MULTIPLY(tmp14, FIX(0.318774355)); /* c9-c11 */ + tmp4 = MULTIPLY(tmp14 - tmp15, FIX(0.937797057)) - /* c7 */ + MULTIPLY(tmp11 + tmp12, FIX(0.338443458)); /* c11 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.163874945)); /* -c5 */ + tmp1 += tmp4 + tmp5 + + MULTIPLY(tmp11, FIX(0.837223564)) - /* c5+c9+c11-c3 */ + MULTIPLY(tmp14, FIX(2.341699410)); /* c1+c7 */ + tmp6 = MULTIPLY(tmp12 + tmp13, - FIX(0.657217813)); /* -c9 */ + tmp2 += tmp4 + tmp6 - + MULTIPLY(tmp12, FIX(1.572116027)) + /* c1+c5-c9-c11 */ + MULTIPLY(tmp15, FIX(2.260109708)); /* c3+c7 */ + tmp3 += tmp5 + tmp6 + + MULTIPLY(tmp13, FIX(2.205608352)) - /* c3+c5+c9-c7 */ + MULTIPLY(tmp15, FIX(1.742345811)); /* c1+c11 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 13) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/13)**2 = 64/169, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/26) * 128/169. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*3]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*2]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*1]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*0]; + tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*7]; + tmp6 = dataptr[DCTSIZE*6]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*4]; + tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*3]; + tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*2]; + tmp13 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*1]; + tmp14 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*0]; + tmp15 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*7]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6, + FIX(0.757396450)), /* 128/169 */ + CONST_BITS+1); + tmp6 += tmp6; + tmp0 -= tmp6; + tmp1 -= tmp6; + tmp2 -= tmp6; + tmp3 -= tmp6; + tmp4 -= tmp6; + tmp5 -= tmp6; + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.039995521)) + /* c2 */ + MULTIPLY(tmp1, FIX(0.801745081)) + /* c6 */ + MULTIPLY(tmp2, FIX(0.379824504)) - /* c10 */ + MULTIPLY(tmp3, FIX(0.129109289)) - /* c12 */ + MULTIPLY(tmp4, FIX(0.608465700)) - /* c8 */ + MULTIPLY(tmp5, FIX(0.948429952)), /* c4 */ + CONST_BITS+1); + z1 = MULTIPLY(tmp0 - tmp2, FIX(0.875087516)) - /* (c4+c6)/2 */ + MULTIPLY(tmp3 - tmp4, FIX(0.330085509)) - /* (c2-c10)/2 */ + MULTIPLY(tmp1 - tmp5, FIX(0.239678205)); /* (c8-c12)/2 */ + z2 = MULTIPLY(tmp0 + tmp2, FIX(0.073342435)) - /* (c4-c6)/2 */ + MULTIPLY(tmp3 + tmp4, FIX(0.709910013)) + /* (c2+c10)/2 */ + MULTIPLY(tmp1 + tmp5, FIX(0.368787494)); /* (c8+c12)/2 */ + + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 - z2, CONST_BITS+1); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.001514908)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(0.881514751)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.710284161)) + /* c7 */ + MULTIPLY(tmp14 + tmp15, FIX(0.256335874)); /* c11 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(tmp10, FIX(1.530003162)) + /* c3+c5+c7-c1 */ + MULTIPLY(tmp14, FIX(0.241438564)); /* c9-c11 */ + tmp4 = MULTIPLY(tmp14 - tmp15, FIX(0.710284161)) - /* c7 */ + MULTIPLY(tmp11 + tmp12, FIX(0.256335874)); /* c11 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(0.881514751)); /* -c5 */ + tmp1 += tmp4 + tmp5 + + MULTIPLY(tmp11, FIX(0.634110155)) - /* c5+c9+c11-c3 */ + MULTIPLY(tmp14, FIX(1.773594819)); /* c1+c7 */ + tmp6 = MULTIPLY(tmp12 + tmp13, - FIX(0.497774438)); /* -c9 */ + tmp2 += tmp4 + tmp6 - + MULTIPLY(tmp12, FIX(1.190715098)) + /* c1+c5-c9-c11 */ + MULTIPLY(tmp15, FIX(1.711799069)); /* c3+c7 */ + tmp3 += tmp5 + tmp6 + + MULTIPLY(tmp13, FIX(1.670519935)) - /* c3+c5+c9-c7 */ + MULTIPLY(tmp15, FIX(1.319646532)); /* c1+c11 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 14x14 sample block. + */ + +GLOBAL(void) +jpeg_fdct_14x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + DCTELEM workspace[8*6]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/28). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[11]); + tmp13 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[7]); + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[11]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[7]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + (tmp10 + tmp11 + tmp12 + tmp13 - 14 * CENTERJSAMPLE); + tmp13 += tmp13; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.274162392)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.314692123)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.881747734)), /* c8 */ + CONST_BITS); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(1.105676686)); /* c6 */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.273079590)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.613604268)), /* c10 */ + CONST_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.719280954)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(1.378756276)), /* c2 */ + CONST_BITS); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[7] = (DCTELEM) (tmp0 - tmp10 + tmp3 - tmp11 - tmp6); + tmp3 <<= CONST_BITS; + tmp10 = MULTIPLY(tmp10, - FIX(0.158341681)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(1.405321284)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(1.197448846)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.752406978)); /* c9 */ + dataptr[5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(2.373959773)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(1.119999435)), /* c1+c11-c9 */ + CONST_BITS); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(1.334852607)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.467085129)); /* c11 */ + dataptr[3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.424103948)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(3.069855259)), /* c1+c5+c11 */ + CONST_BITS); + dataptr[1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + tmp6 - + MULTIPLY(tmp0 + tmp6, FIX(1.126980169)), /* c3+c5-c1 */ + CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 14) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/14)**2 = 16/49, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/28) * 32/49. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*3]; + tmp13 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7]; + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*3]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12 + tmp13, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+1); + tmp13 += tmp13; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(0.832106052)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.205513223)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.575835255)), /* c8 */ + CONST_BITS+1); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(0.722074570)); /* c6 */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.178337691)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.400721155)), /* c10 */ + CONST_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.122795725)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(0.900412262)), /* c2 */ + CONST_BITS+1); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[DCTSIZE*7] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp10 + tmp3 - tmp11 - tmp6, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+1); + tmp3 = MULTIPLY(tmp3 , FIX(0.653061224)); /* 32/49 */ + tmp10 = MULTIPLY(tmp10, - FIX(0.103406812)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(0.917760839)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(0.782007410)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.491367823)); /* c9 */ + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(1.550341076)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(0.731428202)), /* c1+c11-c9 */ + CONST_BITS+1); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(0.871740478)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.305035186)); /* c11 */ + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.276965844)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(2.004803435)), /* c1+c5+c11 */ + CONST_BITS+1); + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + - MULTIPLY(tmp0, FIX(0.735987049)) /* c3+c5-c1 */ + - MULTIPLY(tmp6, FIX(0.082925825)), /* c9-c11-c13 */ + CONST_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 15x15 sample block. + */ + +GLOBAL(void) +jpeg_fdct_15x15 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 z1, z2, z3; + DCTELEM workspace[8*7]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/30). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[14]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[13]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[12]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[11]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[10]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[9]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[8]); + tmp7 = GETJSAMPLE(elemptr[7]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[14]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[13]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[12]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[11]); + tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[10]); + tmp15 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[9]); + tmp16 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[8]); + + z1 = tmp0 + tmp4 + tmp5; + z2 = tmp1 + tmp3 + tmp6; + z3 = tmp2 + tmp7; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) (z1 + z2 + z3 - 15 * CENTERJSAMPLE); + z3 += z3; + dataptr[6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z3, FIX(1.144122806)) - /* c6 */ + MULTIPLY(z2 - z3, FIX(0.437016024)), /* c12 */ + CONST_BITS); + tmp2 += ((tmp1 + tmp4) >> 1) - tmp7 - tmp7; + z1 = MULTIPLY(tmp3 - tmp2, FIX(1.531135173)) - /* c2+c14 */ + MULTIPLY(tmp6 - tmp2, FIX(2.238241955)); /* c4+c8 */ + z2 = MULTIPLY(tmp5 - tmp2, FIX(0.798468008)) - /* c8-c14 */ + MULTIPLY(tmp0 - tmp2, FIX(0.091361227)); /* c2-c4 */ + z3 = MULTIPLY(tmp0 - tmp3, FIX(1.383309603)) + /* c2 */ + MULTIPLY(tmp6 - tmp5, FIX(0.946293579)) + /* c8 */ + MULTIPLY(tmp1 - tmp4, FIX(0.790569415)); /* (c6+c12)/2 */ + + dataptr[2] = (DCTELEM) DESCALE(z1 + z3, CONST_BITS); + dataptr[4] = (DCTELEM) DESCALE(z2 + z3, CONST_BITS); + + /* Odd part */ + + tmp2 = MULTIPLY(tmp10 - tmp12 - tmp13 + tmp15 + tmp16, + FIX(1.224744871)); /* c5 */ + tmp1 = MULTIPLY(tmp10 - tmp14 - tmp15, FIX(1.344997024)) + /* c3 */ + MULTIPLY(tmp11 - tmp13 - tmp16, FIX(0.831253876)); /* c9 */ + tmp12 = MULTIPLY(tmp12, FIX(1.224744871)); /* c5 */ + tmp4 = MULTIPLY(tmp10 - tmp16, FIX(1.406466353)) + /* c1 */ + MULTIPLY(tmp11 + tmp14, FIX(1.344997024)) + /* c3 */ + MULTIPLY(tmp13 + tmp15, FIX(0.575212477)); /* c11 */ + tmp0 = MULTIPLY(tmp13, FIX(0.475753014)) - /* c7-c11 */ + MULTIPLY(tmp14, FIX(0.513743148)) + /* c3-c9 */ + MULTIPLY(tmp16, FIX(1.700497885)) + tmp4 + tmp12; /* c1+c13 */ + tmp3 = MULTIPLY(tmp10, - FIX(0.355500862)) - /* -(c1-c7) */ + MULTIPLY(tmp11, FIX(2.176250899)) - /* c3+c9 */ + MULTIPLY(tmp15, FIX(0.869244010)) + tmp4 - tmp12; /* c11+c13 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 15) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/15)**2 = 64/225, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/30) * 256/225. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*6]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*5]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*4]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*3]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*2]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*1]; + tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*0]; + tmp7 = dataptr[DCTSIZE*7]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*6]; + tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*5]; + tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*4]; + tmp13 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*3]; + tmp14 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*2]; + tmp15 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*1]; + tmp16 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*0]; + + z1 = tmp0 + tmp4 + tmp5; + z2 = tmp1 + tmp3 + tmp6; + z3 = tmp2 + tmp7; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + z2 + z3, FIX(1.137777778)), /* 256/225 */ + CONST_BITS+2); + z3 += z3; + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z3, FIX(1.301757503)) - /* c6 */ + MULTIPLY(z2 - z3, FIX(0.497227121)), /* c12 */ + CONST_BITS+2); + tmp2 += ((tmp1 + tmp4) >> 1) - tmp7 - tmp7; + z1 = MULTIPLY(tmp3 - tmp2, FIX(1.742091575)) - /* c2+c14 */ + MULTIPLY(tmp6 - tmp2, FIX(2.546621957)); /* c4+c8 */ + z2 = MULTIPLY(tmp5 - tmp2, FIX(0.908479156)) - /* c8-c14 */ + MULTIPLY(tmp0 - tmp2, FIX(0.103948774)); /* c2-c4 */ + z3 = MULTIPLY(tmp0 - tmp3, FIX(1.573898926)) + /* c2 */ + MULTIPLY(tmp6 - tmp5, FIX(1.076671805)) + /* c8 */ + MULTIPLY(tmp1 - tmp4, FIX(0.899492312)); /* (c6+c12)/2 */ + + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z3, CONST_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(z2 + z3, CONST_BITS+2); + + /* Odd part */ + + tmp2 = MULTIPLY(tmp10 - tmp12 - tmp13 + tmp15 + tmp16, + FIX(1.393487498)); /* c5 */ + tmp1 = MULTIPLY(tmp10 - tmp14 - tmp15, FIX(1.530307725)) + /* c3 */ + MULTIPLY(tmp11 - tmp13 - tmp16, FIX(0.945782187)); /* c9 */ + tmp12 = MULTIPLY(tmp12, FIX(1.393487498)); /* c5 */ + tmp4 = MULTIPLY(tmp10 - tmp16, FIX(1.600246161)) + /* c1 */ + MULTIPLY(tmp11 + tmp14, FIX(1.530307725)) + /* c3 */ + MULTIPLY(tmp13 + tmp15, FIX(0.654463974)); /* c11 */ + tmp0 = MULTIPLY(tmp13, FIX(0.541301207)) - /* c7-c11 */ + MULTIPLY(tmp14, FIX(0.584525538)) + /* c3-c9 */ + MULTIPLY(tmp16, FIX(1.934788705)) + tmp4 + tmp12; /* c1+c13 */ + tmp3 = MULTIPLY(tmp10, - FIX(0.404480980)) - /* -(c1-c7) */ + MULTIPLY(tmp11, FIX(2.476089912)) - /* c3+c9 */ + MULTIPLY(tmp15, FIX(0.989006518)) + tmp4 - tmp12; /* c11+c13 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+2); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+2); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 16x16 sample block. + */ + +GLOBAL(void) +jpeg_fdct_16x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17; + DCTELEM workspace[DCTSIZE2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + 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. */ + /* cK represents sqrt(2) * cos(K*pi/32). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) + GETJSAMPLE(elemptr[8]); + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) - GETJSAMPLE(elemptr[8]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 + tmp13 - 16 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS-PASS1_BITS); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+c10 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == DCTSIZE * 2) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/16)**2 = 1/2**2. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] + wsptr[DCTSIZE*0]; + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] - wsptr[DCTSIZE*0]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(tmp10 + tmp11 + tmp12 + tmp13, PASS1_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS+PASS1_BITS+2); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+10 */ + CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS+PASS1_BITS+2); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 16x8 sample block. + * + * 16-point FDCT in pass 1 (rows), 8-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_16x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17; + INT32 z1; + DCTELEM *dataptr; + JSAMPROW elemptr; + 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. */ + /* 16-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/32). */ + + dataptr = data; + ctr = 0; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) + GETJSAMPLE(elemptr[8]); + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) - GETJSAMPLE(elemptr[8]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 + tmp13 - 16 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS-PASS1_BITS); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+c10 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, 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. + * We must also scale the output by 8/16 = 1/2. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + + tmp10 = tmp0 + tmp3; + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS+1); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS+PASS1_BITS+1); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12, + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13, + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12, + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13, + CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 14x7 sample block. + * + * 14-point FDCT in pass 1 (rows), 7-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_14x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 z1, z2, z3; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero bottom row of output coefficient block. */ + MEMZERO(&data[DCTSIZE*7], SIZEOF(DCTELEM) * DCTSIZE); + + /* 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. */ + /* 14-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/28). */ + + dataptr = data; + for (ctr = 0; ctr < 7; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[11]); + tmp13 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[7]); + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[11]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[7]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 + tmp13 - 14 * CENTERJSAMPLE) << PASS1_BITS); + tmp13 += tmp13; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.274162392)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.314692123)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.881747734)), /* c8 */ + CONST_BITS-PASS1_BITS); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(1.105676686)); /* c6 */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.273079590)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.613604268)), /* c10 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.719280954)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(1.378756276)), /* c2 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[7] = (DCTELEM) ((tmp0 - tmp10 + tmp3 - tmp11 - tmp6) << PASS1_BITS); + tmp3 <<= CONST_BITS; + tmp10 = MULTIPLY(tmp10, - FIX(0.158341681)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(1.405321284)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(1.197448846)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.752406978)); /* c9 */ + dataptr[5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(2.373959773)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(1.119999435)), /* c1+c11-c9 */ + CONST_BITS-PASS1_BITS); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(1.334852607)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.467085129)); /* c11 */ + dataptr[3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.424103948)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(3.069855259)), /* c1+c5+c11 */ + CONST_BITS-PASS1_BITS); + dataptr[1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + tmp6 - + MULTIPLY(tmp0 + tmp6, FIX(1.126980169)), /* c3+c5-c1 */ + 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. + * We must also scale the output by (8/14)*(8/7) = 32/49, which we + * partially fold into the constant multipliers and final shifting: + * 7-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/14) * 64/49. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*6]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*5]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*4]; + tmp3 = dataptr[DCTSIZE*3]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*6]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*5]; + tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*4]; + + z1 = tmp0 + tmp2; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + tmp1 + tmp3, FIX(1.306122449)), /* 64/49 */ + CONST_BITS+PASS1_BITS+1); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.461784020)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(1.202428084)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.411026446)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS+PASS1_BITS+1); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(1.151670509)); /* c4 */ + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.923568041)), /* c2+c6-c4 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+PASS1_BITS+1); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.221765677)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.222383464)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.800824523)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.801442310)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(2.443531355)); /* c3+c1-c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 12x6 sample block. + * + * 12-point FDCT in pass 1 (rows), 6-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_12x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero 2 bottom rows of output coefficient block. */ + MEMZERO(&data[DCTSIZE*6], SIZEOF(DCTELEM) * DCTSIZE * 2); + + /* 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. */ + /* 12-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/24). */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[6]); + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[6]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 - 12 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[6] = (DCTELEM) ((tmp13 - tmp14 - tmp15) << PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.224744871)), /* c4 */ + CONST_BITS-PASS1_BITS); + dataptr[2] = (DCTELEM) + DESCALE(tmp14 - tmp15 + MULTIPLY(tmp13 + tmp15, FIX(1.366025404)), /* c2 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX_0_541196100); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX_0_765366865); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX_1_847759065); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.121971054)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.860918669)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.580774953)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.184591911)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.184591911)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.339493912)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.860918669)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.725788011)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(1.121971054)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.306562965)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX_0_541196100); /* c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, 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. + * We must also scale the output by (8/12)*(8/6) = 8/9, which we + * partially fold into the constant multipliers and final shifting: + * 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12) * 16/9. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5]; + tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3]; + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(2.177324216)), /* c2 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)), /* c4 */ + CONST_BITS+PASS1_BITS+1); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829)); /* c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 10x5 sample block. + * + * 10-point FDCT in pass 1 (rows), 5-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_10x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero 3 bottom rows of output coefficient block. */ + MEMZERO(&data[DCTSIZE*5], SIZEOF(DCTELEM) * DCTSIZE * 3); + + /* 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. */ + /* 10-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/20). */ + + dataptr = data; + for (ctr = 0; ctr < 5; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[8]); + tmp12 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[5]); + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[8]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[5]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 - 10 * CENTERJSAMPLE) << PASS1_BITS); + tmp12 += tmp12; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.144122806)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.437016024)), /* c8 */ + CONST_BITS-PASS1_BITS); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(0.831253876)); /* c6 */ + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.513743148)), /* c2-c6 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.176250899)), /* c2+c6 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[5] = (DCTELEM) ((tmp10 - tmp11 - tmp2) << PASS1_BITS); + tmp2 <<= CONST_BITS; + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.396802247)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.260073511)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.642039522)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.221231742)), /* c9 */ + CONST_BITS-PASS1_BITS); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(0.951056516)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.587785252)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.309016994)) + /* (c3-c7)/2 */ + (tmp11 << (CONST_BITS - 1)) - tmp2; + dataptr[3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp12 - tmp13, 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. + * We must also scale the output by (8/10)*(8/5) = 32/25, which we + * fold into the constant multipliers: + * 5-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/10) * 32/25. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*3]; + tmp2 = dataptr[DCTSIZE*2]; + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp11 = MULTIPLY(tmp11, FIX(1.011928851)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.452548340)); /* (c2-c4)/2 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(1.064004961)); /* c3 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.657591230)), /* c1-c3 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.785601151)), /* c1+c3 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on an 8x4 sample block. + * + * 8-point FDCT in pass 1 (rows), 4-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_8x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero 4 bottom rows of output coefficient block. */ + MEMZERO(&data[DCTSIZE*4], SIZEOF(DCTELEM) * DCTSIZE * 4); + + /* 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. */ + /* We must also scale the output by 8/4 = 2, which we add here. */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + + tmp10 = tmp0 + tmp3; + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << (PASS1_BITS+1)); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-2); + dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS-PASS1_BITS-1); + dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS-PASS1_BITS-1); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-2); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS-1); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS-1); + dataptr[5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS-1); + dataptr[7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS-1); + + 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. + * 4-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3] + (ONE << (PASS1_BITS-1)); + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS+PASS1_BITS-1); + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 6x3 sample block. + * + * 6-point FDCT in pass 1 (rows), 3-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_6x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11, tmp12; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* 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. */ + /* We scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12). */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]); + tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(1.224744871)), /* c2 */ + CONST_BITS-PASS1_BITS-1); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)), /* c4 */ + CONST_BITS-PASS1_BITS-1); + + /* Odd part */ + + tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)), /* c5 */ + CONST_BITS-PASS1_BITS-1); + + dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << (PASS1_BITS+1))); + dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << (PASS1_BITS+1)); + dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << (PASS1_BITS+1))); + + 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. + * We must also scale the output by (8/6)*(8/3) = 32/9, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * 3-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/6) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*2]; + tmp1 = dataptr[DCTSIZE*1]; + + tmp2 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(1.257078722)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(2.177324216)), /* c1 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 4x2 sample block. + * + * 4-point FDCT in pass 1 (rows), 2-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_4x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* 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. */ + /* We must also scale the output by (8/4)*(8/2) = 2**3, which we add here. */ + /* 4-point FDCT kernel, */ + /* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. */ + + dataptr = data; + for (ctr = 0; ctr < 2; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+3)); + dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+3)); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-4); + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS-3); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS-3); + + 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 = 0; ctr < 4; ctr++) { + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = dataptr[DCTSIZE*0] + (ONE << (PASS1_BITS-1)); + tmp1 = dataptr[DCTSIZE*1]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS); + + /* Odd part */ + + dataptr[DCTSIZE*1] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 2x1 sample block. + * + * 2-point FDCT in pass 1 (rows), 1-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_2x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + JSAMPROW elemptr; + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + elemptr = sample_data[0] + start_col; + + tmp0 = GETJSAMPLE(elemptr[0]); + tmp1 = GETJSAMPLE(elemptr[1]); + + /* We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/2)*(8/1) = 2**5. + */ + + /* Even part */ + /* Apply unsigned->signed conversion */ + data[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5); + + /* Odd part */ + data[1] = (DCTELEM) ((tmp0 - tmp1) << 5); +} + + +/* + * Perform the forward DCT on an 8x16 sample block. + * + * 8-point FDCT in pass 1 (rows), 16-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_8x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17; + INT32 z1; + DCTELEM workspace[DCTSIZE2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + 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; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + + tmp10 = tmp0 + tmp3; + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS-PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == DCTSIZE * 2) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by 8/16 = 1/2. + * 16-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/32). + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] + wsptr[DCTSIZE*0]; + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] - wsptr[DCTSIZE*0]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(tmp10 + tmp11 + tmp12 + tmp13, PASS1_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS+PASS1_BITS+1); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+c10 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS+PASS1_BITS+1); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 7x14 sample block. + * + * 7-point FDCT in pass 1 (rows), 14-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_7x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 z1, z2, z3; + DCTELEM workspace[8*6]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* 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. */ + /* 7-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/14). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[6]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[5]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[4]); + tmp3 = GETJSAMPLE(elemptr[3]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[6]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[5]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[4]); + + z1 = tmp0 + tmp2; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((z1 + tmp1 + tmp3 - 7 * CENTERJSAMPLE) << PASS1_BITS); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.353553391)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(0.920609002)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.314692123)); /* c6 */ + dataptr[2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS-PASS1_BITS); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.881747734)); /* c4 */ + dataptr[4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.707106781)), /* c2+c6-c4 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.613604268)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(1.870828693)); /* c3+c1-c5 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 14) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/7)*(8/14) = 32/49, which we + * fold into the constant multipliers: + * 14-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/28) * 32/49. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*3]; + tmp13 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7]; + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*3]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12 + tmp13, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+PASS1_BITS); + tmp13 += tmp13; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(0.832106052)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.205513223)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.575835255)), /* c8 */ + CONST_BITS+PASS1_BITS); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(0.722074570)); /* c6 */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.178337691)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.400721155)), /* c10 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.122795725)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(0.900412262)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[DCTSIZE*7] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp10 + tmp3 - tmp11 - tmp6, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+PASS1_BITS); + tmp3 = MULTIPLY(tmp3 , FIX(0.653061224)); /* 32/49 */ + tmp10 = MULTIPLY(tmp10, - FIX(0.103406812)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(0.917760839)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(0.782007410)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.491367823)); /* c9 */ + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(1.550341076)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(0.731428202)), /* c1+c11-c9 */ + CONST_BITS+PASS1_BITS); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(0.871740478)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.305035186)); /* c11 */ + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.276965844)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(2.004803435)), /* c1+c5+c11 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + - MULTIPLY(tmp0, FIX(0.735987049)) /* c3+c5-c1 */ + - MULTIPLY(tmp6, FIX(0.082925825)), /* c9-c11-c13 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 6x12 sample block. + * + * 6-point FDCT in pass 1 (rows), 12-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_6x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + DCTELEM workspace[8*4]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* 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. */ + /* 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]); + tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(1.224744871)), /* c2 */ + CONST_BITS-PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)), /* c4 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)), /* c5 */ + CONST_BITS-PASS1_BITS); + + dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << PASS1_BITS)); + dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << PASS1_BITS); + dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << PASS1_BITS)); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 12) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/6)*(8/12) = 8/9, which we + * fold into the constant multipliers: + * 12-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/24) * 8/9. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*6]; + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*6]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(tmp13 - tmp14 - tmp15, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.088662108)), /* c4 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp14 - tmp15, FIX(0.888888889)) + /* 8/9 */ + MULTIPLY(tmp13 + tmp15, FIX(1.214244803)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX(0.481063200)); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX(0.680326102)); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX(1.642452502)); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(0.997307603)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.765261039)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.516244403)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.164081699)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.164081699)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.079550144)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.765261039)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.645144899)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(0.997307603)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.161389302)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX(0.481063200)); /* c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 5x10 sample block. + * + * 5-point FDCT in pass 1 (rows), 10-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_5x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + DCTELEM workspace[8*2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* 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. */ + /* 5-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/10). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[3]); + tmp2 = GETJSAMPLE(elemptr[2]); + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp2 - 5 * CENTERJSAMPLE) << PASS1_BITS); + tmp11 = MULTIPLY(tmp11, FIX(0.790569415)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.353553391)); /* (c2-c4)/2 */ + dataptr[2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS-PASS1_BITS); + dataptr[4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(0.831253876)); /* c3 */ + + dataptr[1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.513743148)), /* c1-c3 */ + CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.176250899)), /* c1+c3 */ + CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 10) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/5)*(8/10) = 32/25, which we + * fold into the constant multipliers: + * 10-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/20) * 32/25. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*0]; + tmp12 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5]; + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*0]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp12 += tmp12; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.464477191)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.559380511)), /* c8 */ + CONST_BITS+PASS1_BITS); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(1.064004961)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.657591230)), /* c2-c6 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.785601151)), /* c2+c6 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp2 = MULTIPLY(tmp2, FIX(1.28)); /* 32/25 */ + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.787906876)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.612894094)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.821810588)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.283176630)), /* c9 */ + CONST_BITS+PASS1_BITS); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(1.217352341)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.752365123)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.395541753)) + /* (c3-c7)/2 */ + MULTIPLY(tmp11, FIX(0.64)) - tmp2; /* 16/25 */ + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 4x8 sample block. + * + * 4-point FDCT in pass 1 (rows), 8-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_4x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* 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. */ + /* We must also scale the output by 8/4 = 2, which we add here. */ + /* 4-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). */ + + dataptr = data; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+1)); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-2); + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS-1); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS-1); + + 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 = 0; ctr < 4; ctr++) { + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + + /* Add fudge factor here for final descale. */ + tmp10 = tmp0 + tmp3 + (ONE << (PASS1_BITS-1)); + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + dataptr[DCTSIZE*2] = (DCTELEM) + RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 3x6 sample block. + * + * 3-point FDCT in pass 1 (rows), 6-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_3x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11, tmp12; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* 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. */ + /* We scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* 3-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/6). */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[2]); + tmp1 = GETJSAMPLE(elemptr[1]); + + tmp2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 3 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(0.707106781)), /* c2 */ + CONST_BITS-PASS1_BITS-1); + + /* Odd part */ + + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(1.224744871)), /* c1 */ + CONST_BITS-PASS1_BITS-1); + + 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. + * We must also scale the output by (8/6)*(8/3) = 32/9, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5]; + tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3]; + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(2.177324216)), /* c2 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)), /* c4 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829)); /* c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 2x4 sample block. + * + * 2-point FDCT in pass 1 (rows), 4-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* We must also scale the output by (8/2)*(8/4) = 2**3, which we add here. */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]); + tmp1 = GETJSAMPLE(elemptr[1]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 3); + + /* Odd part */ + + dataptr[1] = (DCTELEM) ((tmp0 - tmp1) << 3); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * 4-point FDCT kernel, + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. + */ + + dataptr = data; + for (ctr = 0; ctr < 2; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) (tmp0 + tmp1); + dataptr[DCTSIZE*2] = (DCTELEM) (tmp0 - tmp1); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-1); + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 1x2 sample block. + * + * 1-point FDCT in pass 1 (rows), 2-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_1x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + tmp0 = GETJSAMPLE(sample_data[0][start_col]); + tmp1 = GETJSAMPLE(sample_data[1][start_col]); + + /* We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/1)*(8/2) = 2**5. + */ + + /* Even part */ + /* Apply unsigned->signed conversion */ + data[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5); + + /* Odd part */ + data[DCTSIZE*1] = (DCTELEM) ((tmp0 - tmp1) << 5); +} + +#endif /* DCT_SCALING_SUPPORTED */ +#endif /* DCT_ISLOW_SUPPORTED */ diff --git a/jpeg-8c/jfdctint.lo b/jpeg-8c/jfdctint.lo new file mode 100644 index 00000000..fd36e6be --- /dev/null +++ b/jpeg-8c/jfdctint.lo @@ -0,0 +1,12 @@ +# jfdctint.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jfdctint.o' + +# Name of the non-PIC object +non_pic_object='jfdctint.o' + diff --git a/jpeg-8c/jidctflt.c b/jpeg-8c/jidctflt.c new file mode 100644 index 00000000..23ae9d33 --- /dev/null +++ b/jpeg-8c/jidctflt.c @@ -0,0 +1,235 @@ +/* + * jidctflt.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * Modified 2010 by Guido Vollbeding. + * 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 = cinfo->sample_range_limit; + int ctr; + FAST_FLOAT workspace[DCTSIZE2]; /* buffers data between passes */ + + /* 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 = z5 - z12 * ((FAST_FLOAT) 1.082392200); /* 2*(c2-c6) */ + tmp12 = z5 - z10 * ((FAST_FLOAT) 2.613125930); /* 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*3] = tmp3 + tmp4; + wsptr[DCTSIZE*4] = tmp3 - tmp4; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process rows from work array, store into output array. */ + + 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 */ + + /* Apply signed->unsigned and prepare float->int conversion */ + z5 = wsptr[0] + ((FAST_FLOAT) CENTERJSAMPLE + (FAST_FLOAT) 0.5); + tmp10 = z5 + wsptr[4]; + tmp11 = z5 - 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 = z5 - z12 * ((FAST_FLOAT) 1.082392200); /* 2*(c2-c6) */ + tmp12 = z5 - z10 * ((FAST_FLOAT) 2.613125930); /* 2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 - tmp5; + + /* Final output stage: float->int conversion and range-limit */ + + outptr[0] = range_limit[((int) (tmp0 + tmp7)) & RANGE_MASK]; + outptr[7] = range_limit[((int) (tmp0 - tmp7)) & RANGE_MASK]; + outptr[1] = range_limit[((int) (tmp1 + tmp6)) & RANGE_MASK]; + outptr[6] = range_limit[((int) (tmp1 - tmp6)) & RANGE_MASK]; + outptr[2] = range_limit[((int) (tmp2 + tmp5)) & RANGE_MASK]; + outptr[5] = range_limit[((int) (tmp2 - tmp5)) & RANGE_MASK]; + outptr[3] = range_limit[((int) (tmp3 + tmp4)) & RANGE_MASK]; + outptr[4] = range_limit[((int) (tmp3 - tmp4)) & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + +#endif /* DCT_FLOAT_SUPPORTED */ diff --git a/jpeg-8c/jidctflt.lo b/jpeg-8c/jidctflt.lo new file mode 100644 index 00000000..2564e349 --- /dev/null +++ b/jpeg-8c/jidctflt.lo @@ -0,0 +1,12 @@ +# jidctflt.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jidctflt.o' + +# Name of the non-PIC object +non_pic_object='jidctflt.o' + diff --git a/jpeg-8c/jidctfst.c b/jpeg-8c/jidctfst.c new file mode 100644 index 00000000..dba4216f --- /dev/null +++ b/jpeg-8c/jidctfst.c @@ -0,0 +1,368 @@ +/* + * 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/jpeg-8c/jidctfst.lo b/jpeg-8c/jidctfst.lo new file mode 100644 index 00000000..49179f07 --- /dev/null +++ b/jpeg-8c/jidctfst.lo @@ -0,0 +1,12 @@ +# jidctfst.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jidctfst.o' + +# Name of the non-PIC object +non_pic_object='jidctfst.o' + diff --git a/jpeg-8c/jidctint.c b/jpeg-8c/jidctint.c new file mode 100644 index 00000000..dcdf7ce4 --- /dev/null +++ b/jpeg-8c/jidctint.c @@ -0,0 +1,5137 @@ +/* + * jidctint.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modification developed 2002-2009 by Guido Vollbeding. + * 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. + * + * We also provide IDCT routines with various output sample block sizes for + * direct resolution reduction or enlargement and for direct resolving the + * common 2x1 and 1x2 subsampling cases without additional resampling: NxN + * (N=1...16), 2NxN, and Nx2N (N=1...8) pixels for one 8x8 input DCT block. + * + * For N<8 we simply take the corresponding low-frequency coefficients of + * the 8x8 input DCT block and apply an NxN point IDCT on the sub-block + * to yield the downscaled outputs. + * This can be seen as direct low-pass downsampling from the DCT domain + * point of view rather than the usual spatial domain point of view, + * yielding significant computational savings and results at least + * as good as common bilinear (averaging) spatial downsampling. + * + * For N>8 we apply a partial NxN IDCT on the 8 input coefficients as + * lower frequencies and higher frequencies assumed to be zero. + * It turns out that the computational effort is similar to the 8x8 IDCT + * regarding the output size. + * Furthermore, the scaling and descaling is the same for all IDCT sizes. + * + * CAUTION: We rely on the FIX() macro except for the N=1,2,4,8 cases + * since there would be too many additional constants to pre-calculate. + */ + +#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 DCT blocks. /* 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; + 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(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 <<= CONST_BITS; + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z2 += ONE << (CONST_BITS-PASS1_BITS-1); + + tmp0 = z2 + z3; + tmp1 = z2 - z3; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* 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]); + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(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(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + /* Add fudge factor here for final descale. */ + z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 = (INT32) wsptr[4]; + + tmp0 = (z2 + z3) << CONST_BITS; + tmp1 = (z2 - z3) << CONST_BITS; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* 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]; + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + +#ifdef IDCT_SCALING_SUPPORTED + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 7x7 output block. + * + * Optimized algorithm with 12 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/14). + */ + +GLOBAL(void) +jpeg_idct_7x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[7*7]; /* 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 = 0; ctr < 7; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp13 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp13 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp13 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp0 = z1 + z3; + z2 -= tmp0; + tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */ + tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp13 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + + tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp0 += z2; + tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + wsptr[7*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[7*6] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[7*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[7*5] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[7*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[7*4] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[7*3] = (int) RIGHT_SHIFT(tmp13, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 7 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp13 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp13 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp0 = z1 + z3; + z2 -= tmp0; + tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */ + tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp13 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + + tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp0 += z2; + tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 7; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 6x6 output block. + * + * Optimized algorithm with 3 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/12). + */ + +GLOBAL(void) +jpeg_idct_6x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[6*6]; /* 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 = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = RIGHT_SHIFT(tmp0 - tmp10 - tmp10, CONST_BITS-PASS1_BITS); + tmp10 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[6*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*5] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*1] = (int) (tmp11 + tmp1); + wsptr[6*4] = (int) (tmp11 - tmp1); + wsptr[6*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[6*3] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 6 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[4]; + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = tmp0 - tmp10 - tmp10; + tmp10 = (INT32) wsptr[2]; + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << CONST_BITS; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 6; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 5x5 output block. + * + * Optimized algorithm with 5 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/10). + */ + +GLOBAL(void) +jpeg_idct_5x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[5*5]; /* 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 = 0; ctr < 5; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp12 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp12 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp0 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + wsptr[5*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[5*4] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[5*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[5*3] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[5*2] = (int) RIGHT_SHIFT(tmp12, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 5 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp12 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp12 <<= CONST_BITS; + tmp0 = (INT32) wsptr[2]; + tmp1 = (INT32) wsptr[4]; + z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 5; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 4x4 output block. + * + * Optimized algorithm with 3 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT]. + */ + +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; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[4*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 = 0; ctr < 4; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + + tmp10 = (tmp0 + tmp2) << PASS1_BITS; + tmp12 = (tmp0 - tmp2) << PASS1_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp0 = RIGHT_SHIFT(z1 + MULTIPLY(z2, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS); + tmp2 = RIGHT_SHIFT(z1 - MULTIPLY(z3, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS); + + /* Final output stage */ + + wsptr[4*0] = (int) (tmp10 + tmp0); + wsptr[4*3] = (int) (tmp10 - tmp0); + wsptr[4*1] = (int) (tmp12 + tmp2); + wsptr[4*2] = (int) (tmp12 - tmp2); + } + + /* 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; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp2 = (INT32) wsptr[2]; + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 4; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 3x3 output block. + * + * Optimized algorithm with 2 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/6). + */ + +GLOBAL(void) +jpeg_idct_3x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[3*3]; /* 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 = 0; ctr < 3; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + wsptr[3*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*2] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*1] = (int) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 3 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[2]; + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = (INT32) wsptr[1]; + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 3; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 2x2 output block. + * + * Multiplication-less algorithm. + */ + +GLOBAL(void) +jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + ISLOW_MULT_TYPE * quantptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* Pass 1: process columns from input. */ + + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + + /* Column 0 */ + tmp4 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp5 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]); + /* Add fudge factor here for final descale. */ + tmp4 += ONE << 2; + + tmp0 = tmp4 + tmp5; + tmp2 = tmp4 - tmp5; + + /* Column 1 */ + tmp4 = DEQUANTIZE(coef_block[DCTSIZE*0+1], quantptr[DCTSIZE*0+1]); + tmp5 = DEQUANTIZE(coef_block[DCTSIZE*1+1], quantptr[DCTSIZE*1+1]); + + tmp1 = tmp4 + tmp5; + tmp3 = tmp4 - tmp5; + + /* Pass 2: process 2 rows, store into output array. */ + + /* Row 0 */ + outptr = output_buf[0] + output_col; + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK]; + + /* Row 1 */ + outptr = output_buf[1] + output_col; + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp2 + tmp3, 3) & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2 - tmp3, 3) & RANGE_MASK]; +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 1x1 output block. + * + * We hardly need an inverse DCT routine for this: just take the + * average pixel value, which is one-eighth of the DC coefficient. + */ + +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 + + /* 1x1 is trivial: just take the DC coefficient divided by 8. */ + 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]; +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 9x9 output block. + * + * Optimized algorithm with 10 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/18). + */ + +GLOBAL(void) +jpeg_idct_9x9 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13, tmp14; + 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[8*9]; /* 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 = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp3 = MULTIPLY(z3, FIX(0.707106781)); /* c6 */ + tmp1 = tmp0 + tmp3; + tmp2 = tmp0 - tmp3 - tmp3; + + tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */ + tmp11 = tmp2 + tmp0; + tmp14 = tmp2 - tmp0 - tmp0; + + tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */ + tmp2 = MULTIPLY(z1, FIX(1.083350441)); /* c4 */ + tmp3 = MULTIPLY(z2, FIX(0.245575608)); /* c8 */ + + tmp10 = tmp1 + tmp0 - tmp3; + tmp12 = tmp1 - tmp0 + tmp2; + tmp13 = tmp1 - tmp2 + tmp3; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + z2 = MULTIPLY(z2, - FIX(1.224744871)); /* -c3 */ + + tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525)); /* c7 */ + tmp0 = tmp2 + tmp3 - z2; + tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481)); /* c1 */ + tmp2 += z2 - tmp1; + tmp3 += z2 + tmp1; + tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp13 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp13 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp14, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 9 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 9; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp3 = MULTIPLY(z3, FIX(0.707106781)); /* c6 */ + tmp1 = tmp0 + tmp3; + tmp2 = tmp0 - tmp3 - tmp3; + + tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */ + tmp11 = tmp2 + tmp0; + tmp14 = tmp2 - tmp0 - tmp0; + + tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */ + tmp2 = MULTIPLY(z1, FIX(1.083350441)); /* c4 */ + tmp3 = MULTIPLY(z2, FIX(0.245575608)); /* c8 */ + + tmp10 = tmp1 + tmp0 - tmp3; + tmp12 = tmp1 - tmp0 + tmp2; + tmp13 = tmp1 - tmp2 + tmp3; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + z2 = MULTIPLY(z2, - FIX(1.224744871)); /* -c3 */ + + tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525)); /* c7 */ + tmp0 = tmp2 + tmp3 - z2; + tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481)); /* c1 */ + tmp2 += z2 - tmp1; + tmp3 += z2 + tmp1; + tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 10x10 output block. + * + * Optimized algorithm with 12 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/20). + */ + +GLOBAL(void) +jpeg_idct_10x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24; + 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[8*10]; /* 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 = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = RIGHT_SHIFT(z3 - ((z1 - z2) << 1), /* c0 = (c4-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + z5 = z3 << CONST_BITS; + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z5 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z5 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = (z1 - tmp13 - z3) << PASS1_BITS; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) (tmp22 + tmp12); + wsptr[8*7] = (int) (tmp22 - tmp12); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 10 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 10; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = z3 - ((z1 - z2) << 1); /* c0 = (c4-c8)*2 */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[7]; + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z3 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z3 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = ((z1 - tmp13) << CONST_BITS) - z3; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 11x11 output block. + * + * Optimized algorithm with 24 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/22). + */ + +GLOBAL(void) +jpeg_idct_11x11 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + 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[8*11]; /* 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 = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp10 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp10 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132)); /* c2+c4 */ + tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045)); /* c2-c6 */ + z4 = z1 + z3; + tmp24 = MULTIPLY(z4, - FIX(1.155664402)); /* -(c2-c10) */ + z4 -= z2; + tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976)); /* c2 */ + tmp21 = tmp20 + tmp23 + tmp25 - + MULTIPLY(z2, FIX(1.821790775)); /* c2+c4+c10-c6 */ + tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */ + tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */ + tmp24 += tmp25; + tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120)); /* c8+c10 */ + tmp24 += MULTIPLY(z2, FIX(1.944413522)) - /* c2+c8 */ + MULTIPLY(z1, FIX(1.390975730)); /* c4+c10 */ + tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z1 + z2; + tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.887983902)); /* c3-c9 */ + tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295)); /* c5-c9 */ + tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(0.923107866)); /* c7+c5+c3-c1-2*c9 */ + z1 = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */ + tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588)); /* c1+c7+3*c9-c3 */ + tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623)); /* c3+c5-c7-c9 */ + z1 = MULTIPLY(z2 + z4, - FIX(1.798248910)); /* -(c1+c9) */ + tmp11 += z1; + tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632)); /* c1+c5+c9-c7 */ + tmp14 += MULTIPLY(z2, - FIX(1.467221301)) + /* -(c5+c9) */ + MULTIPLY(z3, FIX(1.001388905)) - /* c1-c9 */ + MULTIPLY(z4, FIX(1.684843907)); /* c3+c9 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 11 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 11; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp10 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp10 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132)); /* c2+c4 */ + tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045)); /* c2-c6 */ + z4 = z1 + z3; + tmp24 = MULTIPLY(z4, - FIX(1.155664402)); /* -(c2-c10) */ + z4 -= z2; + tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976)); /* c2 */ + tmp21 = tmp20 + tmp23 + tmp25 - + MULTIPLY(z2, FIX(1.821790775)); /* c2+c4+c10-c6 */ + tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */ + tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */ + tmp24 += tmp25; + tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120)); /* c8+c10 */ + tmp24 += MULTIPLY(z2, FIX(1.944413522)) - /* c2+c8 */ + MULTIPLY(z1, FIX(1.390975730)); /* c4+c10 */ + tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = z1 + z2; + tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.887983902)); /* c3-c9 */ + tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295)); /* c5-c9 */ + tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(0.923107866)); /* c7+c5+c3-c1-2*c9 */ + z1 = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */ + tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588)); /* c1+c7+3*c9-c3 */ + tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623)); /* c3+c5-c7-c9 */ + z1 = MULTIPLY(z2 + z4, - FIX(1.798248910)); /* -(c1+c9) */ + tmp11 += z1; + tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632)); /* c1+c5+c9-c7 */ + tmp14 += MULTIPLY(z2, - FIX(1.467221301)) + /* -(c5+c9) */ + MULTIPLY(z3, FIX(1.001388905)) - /* c1-c9 */ + MULTIPLY(z4, FIX(1.684843907)); /* c3+c9 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 12x12 output block. + * + * Optimized algorithm with 15 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/24). + */ + +GLOBAL(void) +jpeg_idct_12x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + 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[8*12]; /* 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 = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 12 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 12; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + + z4 = (INT32) wsptr[4]; + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = (INT32) wsptr[2]; + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = (INT32) wsptr[6]; + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 13x13 output block. + * + * Optimized algorithm with 29 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/26). + */ + +GLOBAL(void) +jpeg_idct_13x13 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + 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[8*13]; /* 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 = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + tmp12 = MULTIPLY(tmp10, FIX(1.155388986)); /* (c4+c6)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1; /* (c4-c6)/2 */ + + tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13; /* c2 */ + tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13; /* c10 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.316450131)); /* (c8-c12)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1; /* (c8+c12)/2 */ + + tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13; /* c6 */ + tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.435816023)); /* (c2-c10)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1; /* (c2+c10)/2 */ + + tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */ + tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */ + + tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1; /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651)); /* c3 */ + tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945)); /* c5 */ + tmp15 = z1 + z4; + tmp13 = MULTIPLY(tmp15, FIX(0.937797057)); /* c7 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(2.020082300)); /* c7+c5+c3-c1 */ + tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458)); /* -c11 */ + tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */ + tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */ + tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945)); /* -c5 */ + tmp11 += tmp14; + tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */ + tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813)); /* -c9 */ + tmp12 += tmp14; + tmp13 += tmp14; + tmp15 = MULTIPLY(tmp15, FIX(0.338443458)); /* c11 */ + tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */ + MULTIPLY(z2, FIX(0.466105296)); /* c1-c7 */ + z1 = MULTIPLY(z3 - z2, FIX(0.937797057)); /* c7 */ + tmp14 += z1; + tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) - /* c3-c7 */ + MULTIPLY(z4, FIX(1.742345811)); /* c1+c11 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 13 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 13; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[4]; + z4 = (INT32) wsptr[6]; + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + tmp12 = MULTIPLY(tmp10, FIX(1.155388986)); /* (c4+c6)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1; /* (c4-c6)/2 */ + + tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13; /* c2 */ + tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13; /* c10 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.316450131)); /* (c8-c12)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1; /* (c8+c12)/2 */ + + tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13; /* c6 */ + tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.435816023)); /* (c2-c10)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1; /* (c2+c10)/2 */ + + tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */ + tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */ + + tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1; /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651)); /* c3 */ + tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945)); /* c5 */ + tmp15 = z1 + z4; + tmp13 = MULTIPLY(tmp15, FIX(0.937797057)); /* c7 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(2.020082300)); /* c7+c5+c3-c1 */ + tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458)); /* -c11 */ + tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */ + tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */ + tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945)); /* -c5 */ + tmp11 += tmp14; + tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */ + tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813)); /* -c9 */ + tmp12 += tmp14; + tmp13 += tmp14; + tmp15 = MULTIPLY(tmp15, FIX(0.338443458)); /* c11 */ + tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */ + MULTIPLY(z2, FIX(0.466105296)); /* c1-c7 */ + z1 = MULTIPLY(z3 - z2, FIX(0.937797057)); /* c7 */ + tmp14 += z1; + tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) - /* c3-c7 */ + MULTIPLY(z4, FIX(1.742345811)); /* c1+c11 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 14x14 output block. + * + * Optimized algorithm with 20 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/28). + */ + +GLOBAL(void) +jpeg_idct_14x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + 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[8*14]; /* 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 = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = RIGHT_SHIFT(z1 - ((z2 + z3 - z4) << 1), /* c0 = (c4+c12-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp13 = z4 << CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + tmp13 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - tmp13; /* c11 */ + tmp16 += tmp15; + z1 += z4; + z4 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - tmp13; /* -c13 */ + tmp11 += z4 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += z4 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + z4 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += z4 + tmp13 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += z4 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = (z1 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) (tmp23 + tmp13); + wsptr[8*10] = (int) (tmp23 - tmp13); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 14 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 14; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = z1 - ((z2 + z3 - z4) << 1); /* c0 = (c4+c12-c8)*2 */ + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + z4 <<= CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + z4 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - z4; /* c11 */ + tmp16 += tmp15; + tmp13 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - z4; /* -c13 */ + tmp11 += tmp13 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += tmp13 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + tmp13 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += tmp13 + z4 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += tmp13 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = ((z1 - z3) << CONST_BITS) + z4; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 15x15 output block. + * + * Optimized algorithm with 22 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/30). + */ + +GLOBAL(void) +jpeg_idct_15x15 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + 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[8*15]; /* 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 = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */ + tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */ + + tmp12 = z1 - tmp10; + tmp13 = z1 + tmp11; + z1 -= (tmp11 - tmp10) << 1; /* c0 = (c6-c12)*2 */ + + z4 = z2 - z3; + z3 += z2; + tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */ + z2 = MULTIPLY(z2, FIX(1.439773946)); /* c4+c14 */ + + tmp20 = tmp13 + tmp10 + tmp11; + tmp23 = tmp12 - tmp10 + tmp11 + z2; + + tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */ + + tmp25 = tmp13 - tmp10 - tmp11; + tmp26 = tmp12 + tmp10 - tmp11 - z2; + + tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */ + + tmp21 = tmp12 + tmp10 + tmp11; + tmp24 = tmp13 - tmp10 + tmp11; + tmp11 += tmp11; + tmp22 = z1 + tmp11; /* c10 = c6-c12 */ + tmp27 = z1 - tmp11 - tmp11; /* c0 = (c6-c12)*2 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z4 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z3 = MULTIPLY(z4, FIX(1.224744871)); /* c5 */ + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp13 = z2 - z4; + tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876)); /* c9 */ + tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148)); /* c3-c9 */ + tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899)); /* c3+c9 */ + + tmp13 = MULTIPLY(z2, - FIX(0.831253876)); /* -c9 */ + tmp15 = MULTIPLY(z2, - FIX(1.344997024)); /* -c3 */ + z2 = z1 - z4; + tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353)); /* c1 */ + + tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */ + tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */ + tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3; /* c5 */ + z2 = MULTIPLY(z1 + z4, FIX(0.575212477)); /* c11 */ + tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3; /* c7-c11 */ + tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3; /* c11+c13 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*14] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp27, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 15 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 15; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[4]; + z4 = (INT32) wsptr[6]; + + tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */ + tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */ + + tmp12 = z1 - tmp10; + tmp13 = z1 + tmp11; + z1 -= (tmp11 - tmp10) << 1; /* c0 = (c6-c12)*2 */ + + z4 = z2 - z3; + z3 += z2; + tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */ + z2 = MULTIPLY(z2, FIX(1.439773946)); /* c4+c14 */ + + tmp20 = tmp13 + tmp10 + tmp11; + tmp23 = tmp12 - tmp10 + tmp11 + z2; + + tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */ + + tmp25 = tmp13 - tmp10 - tmp11; + tmp26 = tmp12 + tmp10 - tmp11 - z2; + + tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */ + + tmp21 = tmp12 + tmp10 + tmp11; + tmp24 = tmp13 - tmp10 + tmp11; + tmp11 += tmp11; + tmp22 = z1 + tmp11; /* c10 = c6-c12 */ + tmp27 = z1 - tmp11 - tmp11; /* c0 = (c6-c12)*2 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z4 = (INT32) wsptr[5]; + z3 = MULTIPLY(z4, FIX(1.224744871)); /* c5 */ + z4 = (INT32) wsptr[7]; + + tmp13 = z2 - z4; + tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876)); /* c9 */ + tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148)); /* c3-c9 */ + tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899)); /* c3+c9 */ + + tmp13 = MULTIPLY(z2, - FIX(0.831253876)); /* -c9 */ + tmp15 = MULTIPLY(z2, - FIX(1.344997024)); /* -c3 */ + z2 = z1 - z4; + tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353)); /* c1 */ + + tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */ + tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */ + tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3; /* c5 */ + z2 = MULTIPLY(z1 + z4, FIX(0.575212477)); /* c11 */ + tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3; /* c7-c11 */ + tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3; /* c11+c13 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 16x16 output block. + * + * Optimized algorithm with 28 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/32). + */ + +GLOBAL(void) +jpeg_idct_16x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + 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[8*16]; /* 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 = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += 1 << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*15] = (int) RIGHT_SHIFT(tmp20 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*14] = (int) RIGHT_SHIFT(tmp21 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp22 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp23 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp24 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp25 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp26 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 16 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 16; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + + z1 = (INT32) wsptr[4]; + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[15] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp27 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 16x8 output block. + * + * 8-point IDCT in pass 1 (columns), 16-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + 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[8*8]; /* 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(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 <<= CONST_BITS; + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z2 += ONE << (CONST_BITS-PASS1_BITS-1); + + tmp0 = z2 + z3; + tmp1 = z2 - z3; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* 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]); + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process 8 rows from work array, store into output array. + * 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32). + */ + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + + z1 = (INT32) wsptr[4]; + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[15] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp27 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 14x7 output block. + * + * 7-point IDCT in pass 1 (columns), 14-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_14x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + 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[8*7]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp23 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp23 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp23 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp20 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp22 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp21 = tmp20 + tmp22 + tmp23 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp10 = z1 + z3; + z2 -= tmp10; + tmp10 = MULTIPLY(tmp10, FIX(1.274162392)) + tmp23; /* c2 */ + tmp20 += tmp10 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp22 += tmp10 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp23 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + + tmp11 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp10 = tmp11 - tmp12; + tmp11 += tmp12; + tmp12 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp11 += tmp12; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp10 += z2; + tmp12 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 7 rows from work array, store into output array. + * 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28). + */ + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = z1 - ((z2 + z3 - z4) << 1); /* c0 = (c4+c12-c8)*2 */ + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + z4 <<= CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + z4 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - z4; /* c11 */ + tmp16 += tmp15; + tmp13 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - z4; /* -c13 */ + tmp11 += tmp13 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += tmp13 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + tmp13 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += tmp13 + z4 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += tmp13 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = ((z1 - z3) << CONST_BITS) + z4; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 12x6 output block. + * + * 6-point IDCT in pass 1 (columns), 12-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_12x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + 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[8*6]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp10 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp10 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp12 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp20 = MULTIPLY(tmp12, FIX(0.707106781)); /* c4 */ + tmp11 = tmp10 + tmp20; + tmp21 = RIGHT_SHIFT(tmp10 - tmp20 - tmp20, CONST_BITS-PASS1_BITS); + tmp20 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp10 = MULTIPLY(tmp20, FIX(1.224744871)); /* c2 */ + tmp20 = tmp11 + tmp10; + tmp22 = tmp11 - tmp10; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp11 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp10 = tmp11 + ((z1 + z2) << CONST_BITS); + tmp12 = tmp11 + ((z3 - z2) << CONST_BITS); + tmp11 = (z1 - z2 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) (tmp21 + tmp11); + wsptr[8*4] = (int) (tmp21 - tmp11); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 6 rows from work array, store into output array. + * 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24). + */ + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + + z4 = (INT32) wsptr[4]; + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = (INT32) wsptr[2]; + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = (INT32) wsptr[6]; + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 10x5 output block. + * + * 5-point IDCT in pass 1 (columns), 10-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_10x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24; + 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[8*5]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp12 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp12 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp13 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp14 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(tmp13 + tmp14, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp13 - tmp14, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp13 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp14 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp10 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp10 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp11 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp11 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp12, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 5 rows from work array, store into output array. + * 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20). + */ + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = z3 - ((z1 - z2) << 1); /* c0 = (c4-c8)*2 */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[7]; + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z3 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z3 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = ((z1 - tmp13) << CONST_BITS) - z3; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 8x4 output block. + * + * 4-point IDCT in pass 1 (columns), 8-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_8x4 (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; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*4]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + + tmp10 = (tmp0 + tmp2) << PASS1_BITS; + tmp12 = (tmp0 - tmp2) << PASS1_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp0 = RIGHT_SHIFT(z1 + MULTIPLY(z2, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS); + tmp2 = RIGHT_SHIFT(z1 - MULTIPLY(z3, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS); + + /* Final output stage */ + + wsptr[8*0] = (int) (tmp10 + tmp0); + wsptr[8*3] = (int) (tmp10 - tmp0); + wsptr[8*1] = (int) (tmp12 + tmp2); + wsptr[8*2] = (int) (tmp12 - tmp2); + } + + /* 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 < 4; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* 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(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + /* Add fudge factor here for final descale. */ + z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 = (INT32) wsptr[4]; + + tmp0 = (z2 + z3) << CONST_BITS; + tmp1 = (z2 - z3) << CONST_BITS; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* 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]; + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 6x3 output block. + * + * 3-point IDCT in pass 1 (columns), 6-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_6x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[6*3]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + wsptr[6*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*2] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*1] = (int) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 3 rows from work array, store into output array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[4]; + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = tmp0 - tmp10 - tmp10; + tmp10 = (INT32) wsptr[2]; + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << CONST_BITS; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 6; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 4x2 output block. + * + * 2-point IDCT in pass 1 (columns), 4-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_4x2 (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; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + INT32 * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + INT32 workspace[4*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 = 0; ctr < 4; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + + /* Odd part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + /* Final output stage */ + + wsptr[4*0] = tmp10 + tmp0; + wsptr[4*1] = tmp10 - tmp0; + } + + /* Pass 2: process 2 rows from work array, store into output array. + * 4-point IDCT kernel, + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT]. + */ + wsptr = workspace; + for (ctr = 0; ctr < 2; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = wsptr[0] + (ONE << 2); + tmp2 = wsptr[2]; + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = wsptr[1]; + z3 = wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+3) + & RANGE_MASK]; + + wsptr += 4; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 2x1 output block. + * + * 1-point IDCT in pass 1 (columns), 2-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_2x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp10; + ISLOW_MULT_TYPE * quantptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* Pass 1: empty. */ + + /* Pass 2: process 1 row from input, store into output array. */ + + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + outptr = output_buf[0] + output_col; + + /* Even part */ + + tmp10 = DEQUANTIZE(coef_block[0], quantptr[0]); + /* Add fudge factor here for final descale. */ + tmp10 += ONE << 2; + + /* Odd part */ + + tmp0 = DEQUANTIZE(coef_block[1], quantptr[1]); + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3) & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3) & RANGE_MASK]; +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 8x16 output block. + * + * 16-point IDCT in pass 1 (columns), 8-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + 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[8*16]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*15] = (int) RIGHT_SHIFT(tmp20 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*14] = (int) RIGHT_SHIFT(tmp21 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp22 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp23 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp24 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp25 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp26 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS); + } + + /* 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 < 16; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* 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(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + /* Add fudge factor here for final descale. */ + z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 = (INT32) wsptr[4]; + + tmp0 = (z2 + z3) << CONST_BITS; + tmp1 = (z2 - z3) << CONST_BITS; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* 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]; + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 7x14 output block. + * + * 14-point IDCT in pass 1 (columns), 7-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_7x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + 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[7*14]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = RIGHT_SHIFT(z1 - ((z2 + z3 - z4) << 1), /* c0 = (c4+c12-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp13 = z4 << CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + tmp13 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - tmp13; /* c11 */ + tmp16 += tmp15; + z1 += z4; + z4 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - tmp13; /* -c13 */ + tmp11 += z4 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += z4 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + z4 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += z4 + tmp13 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += z4 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = (z1 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[7*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[7*13] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[7*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[7*12] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[7*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[7*11] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[7*3] = (int) (tmp23 + tmp13); + wsptr[7*10] = (int) (tmp23 - tmp13); + wsptr[7*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[7*9] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[7*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[7*8] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[7*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS); + wsptr[7*7] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 14 rows from work array, store into output array. + * 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14). + */ + wsptr = workspace; + for (ctr = 0; ctr < 14; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp23 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp23 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp20 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp22 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp21 = tmp20 + tmp22 + tmp23 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp10 = z1 + z3; + z2 -= tmp10; + tmp10 = MULTIPLY(tmp10, FIX(1.274162392)) + tmp23; /* c2 */ + tmp20 += tmp10 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp22 += tmp10 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp23 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + + tmp11 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp10 = tmp11 - tmp12; + tmp11 += tmp12; + tmp12 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp11 += tmp12; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp10 += z2; + tmp12 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 7; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 6x12 output block. + * + * 12-point IDCT in pass 1 (columns), 6-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_6x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + 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[6*12]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + wsptr[6*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[6*11] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[6*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[6*10] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[6*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[6*9] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[6*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[6*8] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[6*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[6*7] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[6*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[6*6] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 12 rows from work array, store into output array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + wsptr = workspace; + for (ctr = 0; ctr < 12; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp10 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp10 <<= CONST_BITS; + tmp12 = (INT32) wsptr[4]; + tmp20 = MULTIPLY(tmp12, FIX(0.707106781)); /* c4 */ + tmp11 = tmp10 + tmp20; + tmp21 = tmp10 - tmp20 - tmp20; + tmp20 = (INT32) wsptr[2]; + tmp10 = MULTIPLY(tmp20, FIX(1.224744871)); /* c2 */ + tmp20 = tmp11 + tmp10; + tmp22 = tmp11 - tmp10; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + tmp11 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp10 = tmp11 + ((z1 + z2) << CONST_BITS); + tmp12 = tmp11 + ((z3 - z2) << CONST_BITS); + tmp11 = (z1 - z2 - z3) << CONST_BITS; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 6; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 5x10 output block. + * + * 10-point IDCT in pass 1 (columns), 5-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_5x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24; + 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[5*10]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = RIGHT_SHIFT(z3 - ((z1 - z2) << 1), /* c0 = (c4-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + z5 = z3 << CONST_BITS; + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z5 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z5 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = (z1 - tmp13 - z3) << PASS1_BITS; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + wsptr[5*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[5*9] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[5*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[5*8] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[5*2] = (int) (tmp22 + tmp12); + wsptr[5*7] = (int) (tmp22 - tmp12); + wsptr[5*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[5*6] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[5*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[5*5] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 10 rows from work array, store into output array. + * 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10). + */ + wsptr = workspace; + for (ctr = 0; ctr < 10; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp12 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp12 <<= CONST_BITS; + tmp13 = (INT32) wsptr[2]; + tmp14 = (INT32) wsptr[4]; + z1 = MULTIPLY(tmp13 + tmp14, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp13 - tmp14, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp13 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp14 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 5; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 4x8 output block. + * + * 8-point IDCT in pass 1 (columns), 4-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_4x8 (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; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[4*8]; /* 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 = 4; 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[4*0] = dcval; + wsptr[4*1] = dcval; + wsptr[4*2] = dcval; + wsptr[4*3] = dcval; + wsptr[4*4] = dcval; + wsptr[4*5] = dcval; + wsptr[4*6] = dcval; + wsptr[4*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(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 <<= CONST_BITS; + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z2 += ONE << (CONST_BITS-PASS1_BITS-1); + + tmp0 = z2 + z3; + tmp1 = z2 - z3; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* 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]); + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + wsptr[4*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[4*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[4*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[4*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[4*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[4*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[4*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[4*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process 8 rows from work array, store into output array. + * 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + */ + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp2 = (INT32) wsptr[2]; + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 4; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 3x6 output block. + * + * 6-point IDCT in pass 1 (columns), 3-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_3x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[3*6]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = RIGHT_SHIFT(tmp0 - tmp10 - tmp10, CONST_BITS-PASS1_BITS); + tmp10 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[3*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*5] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*1] = (int) (tmp11 + tmp1); + wsptr[3*4] = (int) (tmp11 - tmp1); + wsptr[3*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[3*3] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 6 rows from work array, store into output array. + * 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6). + */ + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[2]; + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = (INT32) wsptr[1]; + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 3; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 2x4 output block. + * + * 4-point IDCT in pass 1 (columns), 2-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_2x4 (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; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + INT32 * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + INT32 workspace[2*4]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 4-point IDCT kernel, + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT]. + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 2; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + wsptr[2*0] = tmp10 + tmp0; + wsptr[2*3] = tmp10 - tmp0; + wsptr[2*1] = tmp12 + tmp2; + wsptr[2*2] = tmp12 - tmp2; + } + + /* 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; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp10 = wsptr[0] + (ONE << (CONST_BITS+2)); + + /* Odd part */ + + tmp0 = wsptr[1]; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS+3) + & RANGE_MASK]; + + wsptr += 2; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 1x2 output block. + * + * 2-point IDCT in pass 1 (columns), 1-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_1x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp10; + ISLOW_MULT_TYPE * quantptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* Process 1 column from input, store into output array. */ + + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + + /* Even part */ + + tmp10 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]); + /* Add fudge factor here for final descale. */ + tmp10 += ONE << 2; + + /* Odd part */ + + tmp0 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]); + + /* Final output stage */ + + output_buf[0][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3) + & RANGE_MASK]; + output_buf[1][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3) + & RANGE_MASK]; +} + +#endif /* IDCT_SCALING_SUPPORTED */ +#endif /* DCT_ISLOW_SUPPORTED */ diff --git a/jpeg-8c/jidctint.lo b/jpeg-8c/jidctint.lo new file mode 100644 index 00000000..5a286e82 --- /dev/null +++ b/jpeg-8c/jidctint.lo @@ -0,0 +1,12 @@ +# jidctint.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jidctint.o' + +# Name of the non-PIC object +non_pic_object='jidctint.o' + diff --git a/jpeg-8c/jinclude.h b/jpeg-8c/jinclude.h new file mode 100644 index 00000000..0a4f1514 --- /dev/null +++ b/jpeg-8c/jinclude.h @@ -0,0 +1,91 @@ +/* + * 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/jpeg-8c/jmemansi.c b/jpeg-8c/jmemansi.c new file mode 100644 index 00000000..2d93e496 --- /dev/null +++ b/jpeg-8c/jmemansi.c @@ -0,0 +1,167 @@ +/* + * jmemansi.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 simple generic implementation of the system- + * dependent portion of the JPEG memory manager. This implementation + * assumes that you have the ANSI-standard library routine tmpfile(). + * Also, the problem of determining the amount of memory available + * is shoved onto the user. + */ + +#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 + +#ifndef SEEK_SET /* pre-ANSI systems may not define this; */ +#define SEEK_SET 0 /* if not, assume 0 is correct */ +#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. + * It's impossible to do this in a portable way; our current solution is + * to make the user tell us (with a default value set at compile time). + * If you can actually get the available space, it's a good idea to subtract + * a slop factor of 5% or so. + */ + +#ifndef DEFAULT_MAX_MEM /* so can override from makefile */ +#define DEFAULT_MAX_MEM 1000000L /* default: one megabyte */ +#endif + +GLOBAL(long) +jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, + long max_bytes_needed, long already_allocated) +{ + return cinfo->mem->max_memory_to_use - already_allocated; +} + + +/* + * Backing store (temporary file) management. + * Backing store objects are only used when the value returned by + * jpeg_mem_available is less than the total space needed. You can dispense + * with these routines if you have plenty of virtual memory; see jmemnobs.c. + */ + + +METHODDEF(void) +read_backing_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + if (fseek(info->temp_file, file_offset, SEEK_SET)) + ERREXIT(cinfo, JERR_TFILE_SEEK); + if (JFREAD(info->temp_file, buffer_address, byte_count) + != (size_t) byte_count) + ERREXIT(cinfo, JERR_TFILE_READ); +} + + +METHODDEF(void) +write_backing_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + if (fseek(info->temp_file, file_offset, SEEK_SET)) + ERREXIT(cinfo, JERR_TFILE_SEEK); + if (JFWRITE(info->temp_file, buffer_address, byte_count) + != (size_t) byte_count) + ERREXIT(cinfo, JERR_TFILE_WRITE); +} + + +METHODDEF(void) +close_backing_store (j_common_ptr cinfo, backing_store_ptr info) +{ + fclose(info->temp_file); + /* Since this implementation uses tmpfile() to create the file, + * no explicit file deletion is needed. + */ +} + + +/* + * Initial opening of a backing-store object. + * + * This version uses tmpfile(), which constructs a suitable file name + * behind the scenes. We don't have to use info->temp_name[] at all; + * indeed, we can't even find out the actual name of the temp file. + */ + +GLOBAL(void) +jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + if ((info->temp_file = tmpfile()) == NULL) + ERREXITS(cinfo, JERR_TFILE_CREATE, ""); + info->read_backing_store = read_backing_store; + info->write_backing_store = write_backing_store; + info->close_backing_store = close_backing_store; +} + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. + */ + +GLOBAL(long) +jpeg_mem_init (j_common_ptr cinfo) +{ + return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ +} + +GLOBAL(void) +jpeg_mem_term (j_common_ptr cinfo) +{ + /* no work */ +} diff --git a/jpeg-8c/jmemdos.c b/jpeg-8c/jmemdos.c new file mode 100644 index 00000000..60b45c69 --- /dev/null +++ b/jpeg-8c/jmemdos.c @@ -0,0 +1,638 @@ +/* + * jmemdos.c + * + * 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 file provides an MS-DOS-compatible implementation of the system- + * dependent portion of the JPEG memory manager. Temporary data can be + * stored in extended or expanded memory as well as in regular DOS files. + * + * If you use this file, you must be sure that NEED_FAR_POINTERS is defined + * if you compile in a small-data memory model; it should NOT be defined if + * you use a large-data memory model. This file is not recommended if you + * are using a flat-memory-space 386 environment such as DJGCC or Watcom C. + * Also, this code will NOT work if struct fields are aligned on greater than + * 2-byte boundaries. + * + * Based on code contributed by Ge' Weijers. + */ + +/* + * If you have both extended and expanded memory, you may want to change the + * order in which they are tried in jopen_backing_store. On a 286 machine + * expanded memory is usually faster, since extended memory access involves + * an expensive protected-mode-and-back switch. On 386 and better, extended + * memory is usually faster. As distributed, the code tries extended memory + * first (what? not everyone has a 386? :-). + * + * You can disable use of extended/expanded memory entirely by altering these + * definitions or overriding them from the Makefile (eg, -DEMS_SUPPORTED=0). + */ + +#ifndef XMS_SUPPORTED +#define XMS_SUPPORTED 1 +#endif +#ifndef EMS_SUPPORTED +#define EMS_SUPPORTED 1 +#endif + + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jmemsys.h" /* import the system-dependent declarations */ + +#ifndef HAVE_STDLIB_H /* should declare these */ +extern void * malloc JPP((size_t size)); +extern void free JPP((void *ptr)); +extern char * getenv JPP((const char * name)); +#endif + +#ifdef NEED_FAR_POINTERS + +#ifdef __TURBOC__ +/* These definitions work for Borland C (Turbo C) */ +#include /* need farmalloc(), farfree() */ +#define far_malloc(x) farmalloc(x) +#define far_free(x) farfree(x) +#else +/* These definitions work for Microsoft C and compatible compilers */ +#include /* need _fmalloc(), _ffree() */ +#define far_malloc(x) _fmalloc(x) +#define far_free(x) _ffree(x) +#endif + +#else /* not NEED_FAR_POINTERS */ + +#define far_malloc(x) malloc(x) +#define far_free(x) free(x) + +#endif /* NEED_FAR_POINTERS */ + +#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */ +#define READ_BINARY "r" +#else +#define READ_BINARY "rb" +#endif + +#ifndef USE_MSDOS_MEMMGR /* make sure user got configuration right */ + You forgot to define USE_MSDOS_MEMMGR in jconfig.h. /* deliberate syntax error */ +#endif + +#if MAX_ALLOC_CHUNK >= 65535L /* make sure jconfig.h got this right */ + MAX_ALLOC_CHUNK should be less than 64K. /* deliberate syntax error */ +#endif + + +/* + * Declarations for assembly-language support routines (see jmemdosa.asm). + * + * The functions are declared "far" as are all their pointer arguments; + * this ensures the assembly source code will work regardless of the + * compiler memory model. We assume "short" is 16 bits, "long" is 32. + */ + +typedef void far * XMSDRIVER; /* actually a pointer to code */ +typedef struct { /* registers for calling XMS driver */ + unsigned short ax, dx, bx; + void far * ds_si; + } XMScontext; +typedef struct { /* registers for calling EMS driver */ + unsigned short ax, dx, bx; + void far * ds_si; + } EMScontext; + +extern short far jdos_open JPP((short far * handle, char far * filename)); +extern short far jdos_close JPP((short handle)); +extern short far jdos_seek JPP((short handle, long offset)); +extern short far jdos_read JPP((short handle, void far * buffer, + unsigned short count)); +extern short far jdos_write JPP((short handle, void far * buffer, + unsigned short count)); +extern void far jxms_getdriver JPP((XMSDRIVER far *)); +extern void far jxms_calldriver JPP((XMSDRIVER, XMScontext far *)); +extern short far jems_available JPP((void)); +extern void far jems_calldriver JPP((EMScontext far *)); + + +/* + * Selection of a file name for a temporary file. + * This is highly system-dependent, and you may want to customize it. + */ + +static int next_file_num; /* to distinguish among several temp files */ + +LOCAL(void) +select_file_name (char * fname) +{ + const char * env; + char * ptr; + FILE * tfile; + + /* Keep generating file names till we find one that's not in use */ + for (;;) { + /* Get temp directory name from environment TMP or TEMP variable; + * if none, use "." + */ + if ((env = (const char *) getenv("TMP")) == NULL) + if ((env = (const char *) getenv("TEMP")) == NULL) + env = "."; + if (*env == '\0') /* null string means "." */ + env = "."; + ptr = fname; /* copy name to fname */ + while (*env != '\0') + *ptr++ = *env++; + if (ptr[-1] != '\\' && ptr[-1] != '/') + *ptr++ = '\\'; /* append backslash if not in env variable */ + /* Append a suitable file name */ + next_file_num++; /* advance counter */ + sprintf(ptr, "JPG%03d.TMP", next_file_num); + /* Probe to see if file name is already in use */ + if ((tfile = fopen(fname, READ_BINARY)) == NULL) + break; + fclose(tfile); /* oops, it's there; close tfile & try again */ + } +} + + +/* + * Near-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 allocated in far memory, if possible + */ + +GLOBAL(void FAR *) +jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void FAR *) far_malloc(sizeofobject); +} + +GLOBAL(void) +jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) +{ + far_free(object); +} + + +/* + * This routine computes the total memory space available for allocation. + * It's impossible to do this in a portable way; our current solution is + * to make the user tell us (with a default value set at compile time). + * If you can actually get the available space, it's a good idea to subtract + * a slop factor of 5% or so. + */ + +#ifndef DEFAULT_MAX_MEM /* so can override from makefile */ +#define DEFAULT_MAX_MEM 300000L /* for total usage about 450K */ +#endif + +GLOBAL(long) +jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, + long max_bytes_needed, long already_allocated) +{ + return cinfo->mem->max_memory_to_use - already_allocated; +} + + +/* + * Backing store (temporary file) management. + * Backing store objects are only used when the value returned by + * jpeg_mem_available is less than the total space needed. You can dispense + * with these routines if you have plenty of virtual memory; see jmemnobs.c. + */ + +/* + * For MS-DOS we support three types of backing storage: + * 1. Conventional DOS files. We access these by direct DOS calls rather + * than via the stdio package. This provides a bit better performance, + * but the real reason is that the buffers to be read or written are FAR. + * The stdio library for small-data memory models can't cope with that. + * 2. Extended memory, accessed per the XMS V2.0 specification. + * 3. Expanded memory, accessed per the LIM/EMS 4.0 specification. + * You'll need copies of those specs to make sense of the related code. + * The specs are available by Internet FTP from the SIMTEL archives + * (oak.oakland.edu and its various mirror sites). See files + * pub/msdos/microsoft/xms20.arc and pub/msdos/info/limems41.zip. + */ + + +/* + * Access methods for a DOS file. + */ + + +METHODDEF(void) +read_file_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + if (jdos_seek(info->handle.file_handle, file_offset)) + ERREXIT(cinfo, JERR_TFILE_SEEK); + /* Since MAX_ALLOC_CHUNK is less than 64K, byte_count will be too. */ + if (byte_count > 65535L) /* safety check */ + ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); + if (jdos_read(info->handle.file_handle, buffer_address, + (unsigned short) byte_count)) + ERREXIT(cinfo, JERR_TFILE_READ); +} + + +METHODDEF(void) +write_file_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + if (jdos_seek(info->handle.file_handle, file_offset)) + ERREXIT(cinfo, JERR_TFILE_SEEK); + /* Since MAX_ALLOC_CHUNK is less than 64K, byte_count will be too. */ + if (byte_count > 65535L) /* safety check */ + ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); + if (jdos_write(info->handle.file_handle, buffer_address, + (unsigned short) byte_count)) + ERREXIT(cinfo, JERR_TFILE_WRITE); +} + + +METHODDEF(void) +close_file_store (j_common_ptr cinfo, backing_store_ptr info) +{ + jdos_close(info->handle.file_handle); /* close the file */ + remove(info->temp_name); /* delete the file */ +/* If your system doesn't have remove(), try unlink() instead. + * remove() is the ANSI-standard name for this function, but + * unlink() was more common in pre-ANSI systems. + */ + TRACEMSS(cinfo, 1, JTRC_TFILE_CLOSE, info->temp_name); +} + + +LOCAL(boolean) +open_file_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + short handle; + + select_file_name(info->temp_name); + if (jdos_open((short far *) & handle, (char far *) info->temp_name)) { + /* might as well exit since jpeg_open_backing_store will fail anyway */ + ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name); + return FALSE; + } + info->handle.file_handle = handle; + info->read_backing_store = read_file_store; + info->write_backing_store = write_file_store; + info->close_backing_store = close_file_store; + TRACEMSS(cinfo, 1, JTRC_TFILE_OPEN, info->temp_name); + return TRUE; /* succeeded */ +} + + +/* + * Access methods for extended memory. + */ + +#if XMS_SUPPORTED + +static XMSDRIVER xms_driver; /* saved address of XMS driver */ + +typedef union { /* either long offset or real-mode pointer */ + long offset; + void far * ptr; + } XMSPTR; + +typedef struct { /* XMS move specification structure */ + long length; + XMSH src_handle; + XMSPTR src; + XMSH dst_handle; + XMSPTR dst; + } XMSspec; + +#define ODD(X) (((X) & 1L) != 0) + + +METHODDEF(void) +read_xms_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + XMScontext ctx; + XMSspec spec; + char endbuffer[2]; + + /* The XMS driver can't cope with an odd length, so handle the last byte + * specially if byte_count is odd. We don't expect this to be common. + */ + + spec.length = byte_count & (~ 1L); + spec.src_handle = info->handle.xms_handle; + spec.src.offset = file_offset; + spec.dst_handle = 0; + spec.dst.ptr = buffer_address; + + ctx.ds_si = (void far *) & spec; + ctx.ax = 0x0b00; /* EMB move */ + jxms_calldriver(xms_driver, (XMScontext far *) & ctx); + if (ctx.ax != 1) + ERREXIT(cinfo, JERR_XMS_READ); + + if (ODD(byte_count)) { + read_xms_store(cinfo, info, (void FAR *) endbuffer, + file_offset + byte_count - 1L, 2L); + ((char FAR *) buffer_address)[byte_count - 1L] = endbuffer[0]; + } +} + + +METHODDEF(void) +write_xms_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + XMScontext ctx; + XMSspec spec; + char endbuffer[2]; + + /* The XMS driver can't cope with an odd length, so handle the last byte + * specially if byte_count is odd. We don't expect this to be common. + */ + + spec.length = byte_count & (~ 1L); + spec.src_handle = 0; + spec.src.ptr = buffer_address; + spec.dst_handle = info->handle.xms_handle; + spec.dst.offset = file_offset; + + ctx.ds_si = (void far *) & spec; + ctx.ax = 0x0b00; /* EMB move */ + jxms_calldriver(xms_driver, (XMScontext far *) & ctx); + if (ctx.ax != 1) + ERREXIT(cinfo, JERR_XMS_WRITE); + + if (ODD(byte_count)) { + read_xms_store(cinfo, info, (void FAR *) endbuffer, + file_offset + byte_count - 1L, 2L); + endbuffer[0] = ((char FAR *) buffer_address)[byte_count - 1L]; + write_xms_store(cinfo, info, (void FAR *) endbuffer, + file_offset + byte_count - 1L, 2L); + } +} + + +METHODDEF(void) +close_xms_store (j_common_ptr cinfo, backing_store_ptr info) +{ + XMScontext ctx; + + ctx.dx = info->handle.xms_handle; + ctx.ax = 0x0a00; + jxms_calldriver(xms_driver, (XMScontext far *) & ctx); + TRACEMS1(cinfo, 1, JTRC_XMS_CLOSE, info->handle.xms_handle); + /* we ignore any error return from the driver */ +} + + +LOCAL(boolean) +open_xms_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + XMScontext ctx; + + /* Get address of XMS driver */ + jxms_getdriver((XMSDRIVER far *) & xms_driver); + if (xms_driver == NULL) + return FALSE; /* no driver to be had */ + + /* Get version number, must be >= 2.00 */ + ctx.ax = 0x0000; + jxms_calldriver(xms_driver, (XMScontext far *) & ctx); + if (ctx.ax < (unsigned short) 0x0200) + return FALSE; + + /* Try to get space (expressed in kilobytes) */ + ctx.dx = (unsigned short) ((total_bytes_needed + 1023L) >> 10); + ctx.ax = 0x0900; + jxms_calldriver(xms_driver, (XMScontext far *) & ctx); + if (ctx.ax != 1) + return FALSE; + + /* Succeeded, save the handle and away we go */ + info->handle.xms_handle = ctx.dx; + info->read_backing_store = read_xms_store; + info->write_backing_store = write_xms_store; + info->close_backing_store = close_xms_store; + TRACEMS1(cinfo, 1, JTRC_XMS_OPEN, ctx.dx); + return TRUE; /* succeeded */ +} + +#endif /* XMS_SUPPORTED */ + + +/* + * Access methods for expanded memory. + */ + +#if EMS_SUPPORTED + +/* The EMS move specification structure requires word and long fields aligned + * at odd byte boundaries. Some compilers will align struct fields at even + * byte boundaries. While it's usually possible to force byte alignment, + * that causes an overall performance penalty and may pose problems in merging + * JPEG into a larger application. Instead we accept some rather dirty code + * here. Note this code would fail if the hardware did not allow odd-byte + * word & long accesses, but all 80x86 CPUs do. + */ + +typedef void far * EMSPTR; + +typedef union { /* EMS move specification structure */ + long length; /* It's easy to access first 4 bytes */ + char bytes[18]; /* Misaligned fields in here! */ + } EMSspec; + +/* Macros for accessing misaligned fields */ +#define FIELD_AT(spec,offset,type) (*((type *) &(spec.bytes[offset]))) +#define SRC_TYPE(spec) FIELD_AT(spec,4,char) +#define SRC_HANDLE(spec) FIELD_AT(spec,5,EMSH) +#define SRC_OFFSET(spec) FIELD_AT(spec,7,unsigned short) +#define SRC_PAGE(spec) FIELD_AT(spec,9,unsigned short) +#define SRC_PTR(spec) FIELD_AT(spec,7,EMSPTR) +#define DST_TYPE(spec) FIELD_AT(spec,11,char) +#define DST_HANDLE(spec) FIELD_AT(spec,12,EMSH) +#define DST_OFFSET(spec) FIELD_AT(spec,14,unsigned short) +#define DST_PAGE(spec) FIELD_AT(spec,16,unsigned short) +#define DST_PTR(spec) FIELD_AT(spec,14,EMSPTR) + +#define EMSPAGESIZE 16384L /* gospel, see the EMS specs */ + +#define HIBYTE(W) (((W) >> 8) & 0xFF) +#define LOBYTE(W) ((W) & 0xFF) + + +METHODDEF(void) +read_ems_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + EMScontext ctx; + EMSspec spec; + + spec.length = byte_count; + SRC_TYPE(spec) = 1; + SRC_HANDLE(spec) = info->handle.ems_handle; + SRC_PAGE(spec) = (unsigned short) (file_offset / EMSPAGESIZE); + SRC_OFFSET(spec) = (unsigned short) (file_offset % EMSPAGESIZE); + DST_TYPE(spec) = 0; + DST_HANDLE(spec) = 0; + DST_PTR(spec) = buffer_address; + + ctx.ds_si = (void far *) & spec; + ctx.ax = 0x5700; /* move memory region */ + jems_calldriver((EMScontext far *) & ctx); + if (HIBYTE(ctx.ax) != 0) + ERREXIT(cinfo, JERR_EMS_READ); +} + + +METHODDEF(void) +write_ems_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + EMScontext ctx; + EMSspec spec; + + spec.length = byte_count; + SRC_TYPE(spec) = 0; + SRC_HANDLE(spec) = 0; + SRC_PTR(spec) = buffer_address; + DST_TYPE(spec) = 1; + DST_HANDLE(spec) = info->handle.ems_handle; + DST_PAGE(spec) = (unsigned short) (file_offset / EMSPAGESIZE); + DST_OFFSET(spec) = (unsigned short) (file_offset % EMSPAGESIZE); + + ctx.ds_si = (void far *) & spec; + ctx.ax = 0x5700; /* move memory region */ + jems_calldriver((EMScontext far *) & ctx); + if (HIBYTE(ctx.ax) != 0) + ERREXIT(cinfo, JERR_EMS_WRITE); +} + + +METHODDEF(void) +close_ems_store (j_common_ptr cinfo, backing_store_ptr info) +{ + EMScontext ctx; + + ctx.ax = 0x4500; + ctx.dx = info->handle.ems_handle; + jems_calldriver((EMScontext far *) & ctx); + TRACEMS1(cinfo, 1, JTRC_EMS_CLOSE, info->handle.ems_handle); + /* we ignore any error return from the driver */ +} + + +LOCAL(boolean) +open_ems_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + EMScontext ctx; + + /* Is EMS driver there? */ + if (! jems_available()) + return FALSE; + + /* Get status, make sure EMS is OK */ + ctx.ax = 0x4000; + jems_calldriver((EMScontext far *) & ctx); + if (HIBYTE(ctx.ax) != 0) + return FALSE; + + /* Get version, must be >= 4.0 */ + ctx.ax = 0x4600; + jems_calldriver((EMScontext far *) & ctx); + if (HIBYTE(ctx.ax) != 0 || LOBYTE(ctx.ax) < 0x40) + return FALSE; + + /* Try to allocate requested space */ + ctx.ax = 0x4300; + ctx.bx = (unsigned short) ((total_bytes_needed + EMSPAGESIZE-1L) / EMSPAGESIZE); + jems_calldriver((EMScontext far *) & ctx); + if (HIBYTE(ctx.ax) != 0) + return FALSE; + + /* Succeeded, save the handle and away we go */ + info->handle.ems_handle = ctx.dx; + info->read_backing_store = read_ems_store; + info->write_backing_store = write_ems_store; + info->close_backing_store = close_ems_store; + TRACEMS1(cinfo, 1, JTRC_EMS_OPEN, ctx.dx); + return TRUE; /* succeeded */ +} + +#endif /* EMS_SUPPORTED */ + + +/* + * Initial opening of a backing-store object. + */ + +GLOBAL(void) +jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + /* Try extended memory, then expanded memory, then regular file. */ +#if XMS_SUPPORTED + if (open_xms_store(cinfo, info, total_bytes_needed)) + return; +#endif +#if EMS_SUPPORTED + if (open_ems_store(cinfo, info, total_bytes_needed)) + return; +#endif + if (open_file_store(cinfo, info, total_bytes_needed)) + return; + ERREXITS(cinfo, JERR_TFILE_CREATE, ""); +} + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. + */ + +GLOBAL(long) +jpeg_mem_init (j_common_ptr cinfo) +{ + next_file_num = 0; /* initialize temp file name generator */ + return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ +} + +GLOBAL(void) +jpeg_mem_term (j_common_ptr cinfo) +{ + /* Microsoft C, at least in v6.00A, will not successfully reclaim freed + * blocks of size > 32Kbytes unless we give it a kick in the rear, like so: + */ +#ifdef NEED_FHEAPMIN + _fheapmin(); +#endif +} diff --git a/jpeg-8c/jmemdosa.asm b/jpeg-8c/jmemdosa.asm new file mode 100644 index 00000000..ecd43729 --- /dev/null +++ b/jpeg-8c/jmemdosa.asm @@ -0,0 +1,379 @@ +; +; jmemdosa.asm +; +; Copyright (C) 1992, 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 low-level interface routines to support the MS-DOS +; backing store manager (jmemdos.c). Routines are provided to access disk +; files through direct DOS calls, and to access XMS and EMS drivers. +; +; This file should assemble with Microsoft's MASM or any compatible +; assembler (including Borland's Turbo Assembler). If you haven't got +; a compatible assembler, better fall back to jmemansi.c or jmemname.c. +; +; To minimize dependence on the C compiler's register usage conventions, +; we save and restore all 8086 registers, even though most compilers only +; require SI,DI,DS to be preserved. Also, we use only 16-bit-wide return +; values, which everybody returns in AX. +; +; Based on code contributed by Ge' Weijers. +; + +JMEMDOSA_TXT segment byte public 'CODE' + + assume cs:JMEMDOSA_TXT + + public _jdos_open + public _jdos_close + public _jdos_seek + public _jdos_read + public _jdos_write + public _jxms_getdriver + public _jxms_calldriver + public _jems_available + public _jems_calldriver + +; +; short far jdos_open (short far * handle, char far * filename) +; +; Create and open a temporary file +; +_jdos_open proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + mov cx,0 ; normal file attributes + lds dx,dword ptr [bp+10] ; get filename pointer + mov ah,3ch ; create file + int 21h + jc open_err ; if failed, return error code + lds bx,dword ptr [bp+6] ; get handle pointer + mov word ptr [bx],ax ; save the handle + xor ax,ax ; return zero for OK +open_err: pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jdos_open endp + + +; +; short far jdos_close (short handle) +; +; Close the file handle +; +_jdos_close proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + mov bx,word ptr [bp+6] ; file handle + mov ah,3eh ; close file + int 21h + jc close_err ; if failed, return error code + xor ax,ax ; return zero for OK +close_err: pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jdos_close endp + + +; +; short far jdos_seek (short handle, long offset) +; +; Set file position +; +_jdos_seek proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + mov bx,word ptr [bp+6] ; file handle + mov dx,word ptr [bp+8] ; LS offset + mov cx,word ptr [bp+10] ; MS offset + mov ax,4200h ; absolute seek + int 21h + jc seek_err ; if failed, return error code + xor ax,ax ; return zero for OK +seek_err: pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jdos_seek endp + + +; +; short far jdos_read (short handle, void far * buffer, unsigned short count) +; +; Read from file +; +_jdos_read proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + mov bx,word ptr [bp+6] ; file handle + lds dx,dword ptr [bp+8] ; buffer address + mov cx,word ptr [bp+12] ; number of bytes + mov ah,3fh ; read file + int 21h + jc read_err ; if failed, return error code + cmp ax,word ptr [bp+12] ; make sure all bytes were read + je read_ok + mov ax,1 ; else return 1 for not OK + jmp short read_err +read_ok: xor ax,ax ; return zero for OK +read_err: pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jdos_read endp + + +; +; short far jdos_write (short handle, void far * buffer, unsigned short count) +; +; Write to file +; +_jdos_write proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + mov bx,word ptr [bp+6] ; file handle + lds dx,dword ptr [bp+8] ; buffer address + mov cx,word ptr [bp+12] ; number of bytes + mov ah,40h ; write file + int 21h + jc write_err ; if failed, return error code + cmp ax,word ptr [bp+12] ; make sure all bytes written + je write_ok + mov ax,1 ; else return 1 for not OK + jmp short write_err +write_ok: xor ax,ax ; return zero for OK +write_err: pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jdos_write endp + + +; +; void far jxms_getdriver (XMSDRIVER far *) +; +; Get the address of the XMS driver, or NULL if not available +; +_jxms_getdriver proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + mov ax,4300h ; call multiplex interrupt with + int 2fh ; a magic cookie, hex 4300 + cmp al,80h ; AL should contain hex 80 + je xmsavail + xor dx,dx ; no XMS driver available + xor ax,ax ; return a nil pointer + jmp short xmsavail_done +xmsavail: mov ax,4310h ; fetch driver address with + int 2fh ; another magic cookie + mov dx,es ; copy address to dx:ax + mov ax,bx +xmsavail_done: les bx,dword ptr [bp+6] ; get pointer to return value + mov word ptr es:[bx],ax + mov word ptr es:[bx+2],dx + pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jxms_getdriver endp + + +; +; void far jxms_calldriver (XMSDRIVER, XMScontext far *) +; +; The XMScontext structure contains values for the AX,DX,BX,SI,DS registers. +; These are loaded, the XMS call is performed, and the new values of the +; AX,DX,BX registers are written back to the context structure. +; +_jxms_calldriver proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + les bx,dword ptr [bp+10] ; get XMScontext pointer + mov ax,word ptr es:[bx] ; load registers + mov dx,word ptr es:[bx+2] + mov si,word ptr es:[bx+6] + mov ds,word ptr es:[bx+8] + mov bx,word ptr es:[bx+4] + call dword ptr [bp+6] ; call the driver + mov cx,bx ; save returned BX for a sec + les bx,dword ptr [bp+10] ; get XMScontext pointer + mov word ptr es:[bx],ax ; put back ax,dx,bx + mov word ptr es:[bx+2],dx + mov word ptr es:[bx+4],cx + pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jxms_calldriver endp + + +; +; short far jems_available (void) +; +; Have we got an EMS driver? (this comes straight from the EMS 4.0 specs) +; +_jems_available proc far + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + mov ax,3567h ; get interrupt vector 67h + int 21h + push cs + pop ds + mov di,000ah ; check offs 10 in returned seg + lea si,ASCII_device_name ; against literal string + mov cx,8 + cld + repe cmpsb + jne no_ems + mov ax,1 ; match, it's there + jmp short avail_done +no_ems: xor ax,ax ; it's not there +avail_done: pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + ret + +ASCII_device_name db "EMMXXXX0" + +_jems_available endp + + +; +; void far jems_calldriver (EMScontext far *) +; +; The EMScontext structure contains values for the AX,DX,BX,SI,DS registers. +; These are loaded, the EMS trap is performed, and the new values of the +; AX,DX,BX registers are written back to the context structure. +; +_jems_calldriver proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + les bx,dword ptr [bp+6] ; get EMScontext pointer + mov ax,word ptr es:[bx] ; load registers + mov dx,word ptr es:[bx+2] + mov si,word ptr es:[bx+6] + mov ds,word ptr es:[bx+8] + mov bx,word ptr es:[bx+4] + int 67h ; call the EMS driver + mov cx,bx ; save returned BX for a sec + les bx,dword ptr [bp+6] ; get EMScontext pointer + mov word ptr es:[bx],ax ; put back ax,dx,bx + mov word ptr es:[bx+2],dx + mov word ptr es:[bx+4],cx + pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jems_calldriver endp + +JMEMDOSA_TXT ends + + end diff --git a/jpeg-8c/jmemmac.c b/jpeg-8c/jmemmac.c new file mode 100644 index 00000000..106f9bea --- /dev/null +++ b/jpeg-8c/jmemmac.c @@ -0,0 +1,289 @@ +/* + * jmemmac.c + * + * 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. + * + * jmemmac.c provides an Apple Macintosh implementation of the system- + * dependent portion of the JPEG memory manager. + * + * If you use jmemmac.c, then you must define USE_MAC_MEMMGR in the + * JPEG_INTERNALS part of jconfig.h. + * + * jmemmac.c uses the Macintosh toolbox routines NewPtr and DisposePtr + * instead of malloc and free. It accurately determines the amount of + * memory available by using CompactMem. Notice that if left to its + * own devices, this code can chew up all available space in the + * application's zone, with the exception of the rather small "slop" + * factor computed in jpeg_mem_available(). The application can ensure + * that more space is left over by reducing max_memory_to_use. + * + * Large images are swapped to disk using temporary files and System 7.0+'s + * temporary folder functionality. + * + * Note that jmemmac.c depends on two features of MacOS that were first + * introduced in System 7: FindFolder and the FSSpec-based calls. + * If your application uses jmemmac.c and is run under System 6 or earlier, + * and the jpeg library decides it needs a temporary file, it will abort, + * printing error messages about requiring System 7. (If no temporary files + * are created, it will run fine.) + * + * If you want to use jmemmac.c in an application that might be used with + * System 6 or earlier, then you should remove dependencies on FindFolder + * and the FSSpec calls. You will need to replace FindFolder with some + * other mechanism for finding a place to put temporary files, and you + * should replace the FSSpec calls with their HFS equivalents: + * + * FSpDelete -> HDelete + * FSpGetFInfo -> HGetFInfo + * FSpCreate -> HCreate + * FSpOpenDF -> HOpen *** Note: not HOpenDF *** + * FSMakeFSSpec -> (fill in spec by hand.) + * + * (Use HOpen instead of HOpenDF. HOpen is just a glue-interface to PBHOpen, + * which is on all HFS macs. HOpenDF is a System 7 addition which avoids the + * ages-old problem of names starting with a period.) + * + * Contributed by Sam Bushell (jsam@iagu.on.net) and + * Dan Gildor (gyld@in-touch.com). + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jmemsys.h" /* import the system-dependent declarations */ + +#ifndef USE_MAC_MEMMGR /* make sure user got configuration right */ + You forgot to define USE_MAC_MEMMGR in jconfig.h. /* deliberate syntax error */ +#endif + +#include /* we use the MacOS memory manager */ +#include /* we use the MacOS File stuff */ +#include /* we use the MacOS HFS stuff */ +#include /* for smSystemScript */ +#include /* we use Gestalt to test for specific functionality */ + +#ifndef TEMP_FILE_NAME /* can override from jconfig.h or Makefile */ +#define TEMP_FILE_NAME "JPG%03d.TMP" +#endif + +static int next_file_num; /* to distinguish among several temp files */ + + +/* + * Memory allocation and freeing are controlled by the MacOS library + * routines NewPtr() and DisposePtr(), which allocate fixed-address + * storage. Unfortunately, the IJG library isn't smart enough to cope + * with relocatable storage. + */ + +GLOBAL(void *) +jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void *) NewPtr(sizeofobject); +} + +GLOBAL(void) +jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) +{ + DisposePtr((Ptr) object); +} + + +/* + * "Large" objects are treated the same as "small" ones. + * NB: we include FAR keywords in the routine declarations simply for + * consistency with the rest of the IJG code; FAR should expand to empty + * on rational architectures like the Mac. + */ + +GLOBAL(void FAR *) +jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void FAR *) NewPtr(sizeofobject); +} + +GLOBAL(void) +jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) +{ + DisposePtr((Ptr) object); +} + + +/* + * This routine computes the total memory space available for allocation. + */ + +GLOBAL(long) +jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, + long max_bytes_needed, long already_allocated) +{ + long limit = cinfo->mem->max_memory_to_use - already_allocated; + long slop, mem; + + /* Don't ask for more than what application has told us we may use */ + if (max_bytes_needed > limit && limit > 0) + max_bytes_needed = limit; + /* Find whether there's a big enough free block in the heap. + * CompactMem tries to create a contiguous block of the requested size, + * and then returns the size of the largest free block (which could be + * much more or much less than we asked for). + * We add some slop to ensure we don't use up all available memory. + */ + slop = max_bytes_needed / 16 + 32768L; + mem = CompactMem(max_bytes_needed + slop) - slop; + if (mem < 0) + mem = 0; /* sigh, couldn't even get the slop */ + /* Don't take more than the application says we can have */ + if (mem > limit && limit > 0) + mem = limit; + return mem; +} + + +/* + * Backing store (temporary file) management. + * Backing store objects are only used when the value returned by + * jpeg_mem_available is less than the total space needed. You can dispense + * with these routines if you have plenty of virtual memory; see jmemnobs.c. + */ + + +METHODDEF(void) +read_backing_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + long bytes = byte_count; + long retVal; + + if ( SetFPos ( info->temp_file, fsFromStart, file_offset ) != noErr ) + ERREXIT(cinfo, JERR_TFILE_SEEK); + + retVal = FSRead ( info->temp_file, &bytes, + (unsigned char *) buffer_address ); + if ( retVal != noErr || bytes != byte_count ) + ERREXIT(cinfo, JERR_TFILE_READ); +} + + +METHODDEF(void) +write_backing_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + long bytes = byte_count; + long retVal; + + if ( SetFPos ( info->temp_file, fsFromStart, file_offset ) != noErr ) + ERREXIT(cinfo, JERR_TFILE_SEEK); + + retVal = FSWrite ( info->temp_file, &bytes, + (unsigned char *) buffer_address ); + if ( retVal != noErr || bytes != byte_count ) + ERREXIT(cinfo, JERR_TFILE_WRITE); +} + + +METHODDEF(void) +close_backing_store (j_common_ptr cinfo, backing_store_ptr info) +{ + FSClose ( info->temp_file ); + FSpDelete ( &(info->tempSpec) ); +} + + +/* + * Initial opening of a backing-store object. + * + * This version uses FindFolder to find the Temporary Items folder, + * and puts the temporary file in there. + */ + +GLOBAL(void) +jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + short tmpRef, vRefNum; + long dirID; + FInfo finderInfo; + FSSpec theSpec; + Str255 fName; + OSErr osErr; + long gestaltResponse = 0; + + /* Check that FSSpec calls are available. */ + osErr = Gestalt( gestaltFSAttr, &gestaltResponse ); + if ( ( osErr != noErr ) + || !( gestaltResponse & (1<temp_name, TEMP_FILE_NAME, next_file_num); + strcpy ( (Ptr)fName+1, info->temp_name ); + *fName = strlen (info->temp_name); + osErr = FSMakeFSSpec ( vRefNum, dirID, fName, &theSpec ); + + if ( (osErr = FSpGetFInfo ( &theSpec, &finderInfo ) ) != noErr ) + break; + } + + osErr = FSpCreate ( &theSpec, '????', '????', smSystemScript ); + if ( osErr != noErr ) + ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name); + + osErr = FSpOpenDF ( &theSpec, fsRdWrPerm, &(info->temp_file) ); + if ( osErr != noErr ) + ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name); + + info->tempSpec = theSpec; + + info->read_backing_store = read_backing_store; + info->write_backing_store = write_backing_store; + info->close_backing_store = close_backing_store; + TRACEMSS(cinfo, 1, JTRC_TFILE_OPEN, info->temp_name); +} + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. + */ + +GLOBAL(long) +jpeg_mem_init (j_common_ptr cinfo) +{ + next_file_num = 0; + + /* max_memory_to_use will be initialized to FreeMem()'s result; + * the calling application might later reduce it, for example + * to leave room to invoke multiple JPEG objects. + * Note that FreeMem returns the total number of free bytes; + * it may not be possible to allocate a single block of this size. + */ + return FreeMem(); +} + +GLOBAL(void) +jpeg_mem_term (j_common_ptr cinfo) +{ + /* no work */ +} diff --git a/jpeg-8c/jmemmgr.c b/jpeg-8c/jmemmgr.c new file mode 100644 index 00000000..d801b322 --- /dev/null +++ b/jpeg-8c/jmemmgr.c @@ -0,0 +1,1118 @@ +/* + * 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/jpeg-8c/jmemmgr.lo b/jpeg-8c/jmemmgr.lo new file mode 100644 index 00000000..bb15d2ce --- /dev/null +++ b/jpeg-8c/jmemmgr.lo @@ -0,0 +1,12 @@ +# jmemmgr.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jmemmgr.o' + +# Name of the non-PIC object +non_pic_object='jmemmgr.o' + diff --git a/jpeg-8c/jmemname.c b/jpeg-8c/jmemname.c new file mode 100644 index 00000000..ed96dee1 --- /dev/null +++ b/jpeg-8c/jmemname.c @@ -0,0 +1,276 @@ +/* + * jmemname.c + * + * 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 file provides a generic implementation of the system-dependent + * portion of the JPEG memory manager. This implementation assumes that + * you must explicitly construct a name for each temp file. + * Also, the problem of determining the amount of memory available + * is shoved onto the user. + */ + +#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 + +#ifndef SEEK_SET /* pre-ANSI systems may not define this; */ +#define SEEK_SET 0 /* if not, assume 0 is correct */ +#endif + +#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */ +#define READ_BINARY "r" +#define RW_BINARY "w+" +#else +#ifdef VMS /* VMS is very nonstandard */ +#define READ_BINARY "rb", "ctx=stm" +#define RW_BINARY "w+b", "ctx=stm" +#else /* standard ANSI-compliant case */ +#define READ_BINARY "rb" +#define RW_BINARY "w+b" +#endif +#endif + + +/* + * Selection of a file name for a temporary file. + * This is system-dependent! + * + * The code as given is suitable for most Unix systems, and it is easily + * modified for most non-Unix systems. Some notes: + * 1. The temp file is created in the directory named by TEMP_DIRECTORY. + * The default value is /usr/tmp, which is the conventional place for + * creating large temp files on Unix. On other systems you'll probably + * want to change the file location. You can do this by editing the + * #define, or (preferred) by defining TEMP_DIRECTORY in jconfig.h. + * + * 2. If you need to change the file name as well as its location, + * you can override the TEMP_FILE_NAME macro. (Note that this is + * actually a printf format string; it must contain %s and %d.) + * Few people should need to do this. + * + * 3. mktemp() is used to ensure that multiple processes running + * simultaneously won't select the same file names. If your system + * doesn't have mktemp(), define NO_MKTEMP to do it the hard way. + * (If you don't have , also define NO_ERRNO_H.) + * + * 4. You probably want to define NEED_SIGNAL_CATCHER so that cjpeg.c/djpeg.c + * will cause the temp files to be removed if you stop the program early. + */ + +#ifndef TEMP_DIRECTORY /* can override from jconfig.h or Makefile */ +#define TEMP_DIRECTORY "/usr/tmp/" /* recommended setting for Unix */ +#endif + +static int next_file_num; /* to distinguish among several temp files */ + +#ifdef NO_MKTEMP + +#ifndef TEMP_FILE_NAME /* can override from jconfig.h or Makefile */ +#define TEMP_FILE_NAME "%sJPG%03d.TMP" +#endif + +#ifndef NO_ERRNO_H +#include /* to define ENOENT */ +#endif + +/* ANSI C specifies that errno is a macro, but on older systems it's more + * likely to be a plain int variable. And not all versions of errno.h + * bother to declare it, so we have to in order to be most portable. Thus: + */ +#ifndef errno +extern int errno; +#endif + + +LOCAL(void) +select_file_name (char * fname) +{ + FILE * tfile; + + /* Keep generating file names till we find one that's not in use */ + for (;;) { + next_file_num++; /* advance counter */ + sprintf(fname, TEMP_FILE_NAME, TEMP_DIRECTORY, next_file_num); + if ((tfile = fopen(fname, READ_BINARY)) == NULL) { + /* fopen could have failed for a reason other than the file not + * being there; for example, file there but unreadable. + * If isn't available, then we cannot test the cause. + */ +#ifdef ENOENT + if (errno != ENOENT) + continue; +#endif + break; + } + fclose(tfile); /* oops, it's there; close tfile & try again */ + } +} + +#else /* ! NO_MKTEMP */ + +/* Note that mktemp() requires the initial filename to end in six X's */ +#ifndef TEMP_FILE_NAME /* can override from jconfig.h or Makefile */ +#define TEMP_FILE_NAME "%sJPG%dXXXXXX" +#endif + +LOCAL(void) +select_file_name (char * fname) +{ + next_file_num++; /* advance counter */ + sprintf(fname, TEMP_FILE_NAME, TEMP_DIRECTORY, next_file_num); + mktemp(fname); /* make sure file name is unique */ + /* mktemp replaces the trailing XXXXXX with a unique string of characters */ +} + +#endif /* NO_MKTEMP */ + + +/* + * 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. + * It's impossible to do this in a portable way; our current solution is + * to make the user tell us (with a default value set at compile time). + * If you can actually get the available space, it's a good idea to subtract + * a slop factor of 5% or so. + */ + +#ifndef DEFAULT_MAX_MEM /* so can override from makefile */ +#define DEFAULT_MAX_MEM 1000000L /* default: one megabyte */ +#endif + +GLOBAL(long) +jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, + long max_bytes_needed, long already_allocated) +{ + return cinfo->mem->max_memory_to_use - already_allocated; +} + + +/* + * Backing store (temporary file) management. + * Backing store objects are only used when the value returned by + * jpeg_mem_available is less than the total space needed. You can dispense + * with these routines if you have plenty of virtual memory; see jmemnobs.c. + */ + + +METHODDEF(void) +read_backing_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + if (fseek(info->temp_file, file_offset, SEEK_SET)) + ERREXIT(cinfo, JERR_TFILE_SEEK); + if (JFREAD(info->temp_file, buffer_address, byte_count) + != (size_t) byte_count) + ERREXIT(cinfo, JERR_TFILE_READ); +} + + +METHODDEF(void) +write_backing_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + if (fseek(info->temp_file, file_offset, SEEK_SET)) + ERREXIT(cinfo, JERR_TFILE_SEEK); + if (JFWRITE(info->temp_file, buffer_address, byte_count) + != (size_t) byte_count) + ERREXIT(cinfo, JERR_TFILE_WRITE); +} + + +METHODDEF(void) +close_backing_store (j_common_ptr cinfo, backing_store_ptr info) +{ + fclose(info->temp_file); /* close the file */ + unlink(info->temp_name); /* delete the file */ +/* If your system doesn't have unlink(), use remove() instead. + * remove() is the ANSI-standard name for this function, but if + * your system was ANSI you'd be using jmemansi.c, right? + */ + TRACEMSS(cinfo, 1, JTRC_TFILE_CLOSE, info->temp_name); +} + + +/* + * Initial opening of a backing-store object. + */ + +GLOBAL(void) +jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + select_file_name(info->temp_name); + if ((info->temp_file = fopen(info->temp_name, RW_BINARY)) == NULL) + ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name); + info->read_backing_store = read_backing_store; + info->write_backing_store = write_backing_store; + info->close_backing_store = close_backing_store; + TRACEMSS(cinfo, 1, JTRC_TFILE_OPEN, info->temp_name); +} + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. + */ + +GLOBAL(long) +jpeg_mem_init (j_common_ptr cinfo) +{ + next_file_num = 0; /* initialize temp file name generator */ + return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ +} + +GLOBAL(void) +jpeg_mem_term (j_common_ptr cinfo) +{ + /* no work */ +} diff --git a/jpeg-8c/jmemnobs.c b/jpeg-8c/jmemnobs.c new file mode 100644 index 00000000..eb8c3377 --- /dev/null +++ b/jpeg-8c/jmemnobs.c @@ -0,0 +1,109 @@ +/* + * 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/jpeg-8c/jmemnobs.lo b/jpeg-8c/jmemnobs.lo new file mode 100644 index 00000000..50865451 --- /dev/null +++ b/jpeg-8c/jmemnobs.lo @@ -0,0 +1,12 @@ +# jmemnobs.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jmemnobs.o' + +# Name of the non-PIC object +non_pic_object='jmemnobs.o' + diff --git a/jpeg-8c/jmemsys.h b/jpeg-8c/jmemsys.h new file mode 100644 index 00000000..6c3c6d34 --- /dev/null +++ b/jpeg-8c/jmemsys.h @@ -0,0 +1,198 @@ +/* + * 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/jpeg-8c/jmorecfg.h b/jpeg-8c/jmorecfg.h new file mode 100644 index 00000000..928d052c --- /dev/null +++ b/jpeg-8c/jmorecfg.h @@ -0,0 +1,371 @@ +/* + * jmorecfg.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 1997-2009 by Guido Vollbeding. + * 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 additional configuration options that customize the + * JPEG software for special applications or support machine-dependent + * optimizations. Most users will not need to touch this file. + */ + + +/* + * Define BITS_IN_JSAMPLE as either + * 8 for 8-bit sample values (the usual setting) + * 12 for 12-bit sample values + * Only 8 and 12 are legal data precisions for lossy JPEG according to the + * JPEG standard, and the IJG code does not support anything else! + * We do not support run-time selection of data precision, sorry. + */ + +#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ + + +/* + * Maximum number of components (color channels) allowed in JPEG image. + * To meet the letter of the JPEG spec, set this to 255. However, darn + * few applications need more than 4 channels (maybe 5 for CMYK + alpha + * mask). We recommend 10 as a reasonable compromise; use 4 if you are + * really short on memory. (Each allowed component costs a hundred or so + * bytes of storage, whether actually used in an image or not.) + */ + +#define MAX_COMPONENTS 10 /* maximum number of image components */ + + +/* + * Basic data types. + * You may need to change these if you have a machine with unusual data + * type sizes; for example, "char" not 8 bits, "short" not 16 bits, + * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, + * but it had better be at least 16. + */ + +/* Representation of a single sample (pixel element value). + * We frequently allocate large arrays of these, so it's important to keep + * them small. But if you have memory to burn and access to char or short + * arrays is very slow on your hardware, you might want to change these. + */ + +#if BITS_IN_JSAMPLE == 8 +/* JSAMPLE should be the smallest type that will hold the values 0..255. + * You can use a signed char by having GETJSAMPLE mask it with 0xFF. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JSAMPLE; +#ifdef CHAR_IS_UNSIGNED +#define GETJSAMPLE(value) ((int) (value)) +#else +#define GETJSAMPLE(value) ((int) (value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + +#define MAXJSAMPLE 255 +#define CENTERJSAMPLE 128 + +#endif /* BITS_IN_JSAMPLE == 8 */ + + +#if BITS_IN_JSAMPLE == 12 +/* JSAMPLE should be the smallest type that will hold the values 0..4095. + * On nearly all machines "short" will do nicely. + */ + +typedef short JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#define MAXJSAMPLE 4095 +#define CENTERJSAMPLE 2048 + +#endif /* BITS_IN_JSAMPLE == 12 */ + + +/* Representation of a DCT frequency coefficient. + * This should be a signed value of at least 16 bits; "short" is usually OK. + * Again, we allocate large arrays of these, but you can change to int + * if you have memory to burn and "short" is really slow. + */ + +typedef short JCOEF; + + +/* Compressed datastreams are represented as arrays of JOCTET. + * These must be EXACTLY 8 bits wide, at least once they are written to + * external storage. Note that when using the stdio data source/destination + * managers, this is also the data type passed to fread/fwrite. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JOCTET; +#define GETJOCTET(value) (value) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JOCTET; +#ifdef CHAR_IS_UNSIGNED +#define GETJOCTET(value) (value) +#else +#define GETJOCTET(value) ((value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + + +/* These typedefs are used for various table entries and so forth. + * They must be at least as wide as specified; but making them too big + * won't cost a huge amount of memory, so we don't provide special + * extraction code like we did for JSAMPLE. (In other words, these + * typedefs live at a different point on the speed/space tradeoff curve.) + */ + +/* UINT8 must hold at least the values 0..255. */ + +#ifdef HAVE_UNSIGNED_CHAR +typedef unsigned char UINT8; +#else /* not HAVE_UNSIGNED_CHAR */ +#ifdef CHAR_IS_UNSIGNED +typedef char UINT8; +#else /* not CHAR_IS_UNSIGNED */ +typedef short UINT8; +#endif /* CHAR_IS_UNSIGNED */ +#endif /* HAVE_UNSIGNED_CHAR */ + +/* UINT16 must hold at least the values 0..65535. */ + +#ifdef HAVE_UNSIGNED_SHORT +typedef unsigned short UINT16; +#else /* not HAVE_UNSIGNED_SHORT */ +typedef unsigned int UINT16; +#endif /* HAVE_UNSIGNED_SHORT */ + +/* INT16 must hold at least the values -32768..32767. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ +typedef short INT16; +#endif + +/* INT32 must hold at least signed 32-bit values. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ +#ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */ +#ifndef _BASETSD_H /* MinGW is slightly different */ +#ifndef QGLOBAL_H /* Qt defines it in qglobal.h */ +typedef long INT32; +#endif +#endif +#endif +#endif + +/* Datatype used for image dimensions. The JPEG standard only supports + * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore + * "unsigned int" is sufficient on all machines. However, if you need to + * handle larger images and you don't mind deviating from the spec, you + * can change this datatype. + */ + +typedef unsigned int JDIMENSION; + +#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ + + +/* These macros are used in all function definitions and extern declarations. + * You could modify them if you need to change function linkage conventions; + * in particular, you'll need to do that to make the library a Windows DLL. + * Another application is to make all functions global for use with debuggers + * or code profilers that require it. + */ + +/* a function called through method pointers: */ +#define METHODDEF(type) static type +/* a function used only in its module: */ +#define LOCAL(type) static type +/* a function referenced thru EXTERNs: */ +#define GLOBAL(type) type +/* a reference to a GLOBAL function: */ +#define EXTERN(type) extern type + + +/* This macro is used to declare a "method", that is, a function pointer. + * We want to supply prototype parameters if the compiler can cope. + * Note that the arglist parameter must be parenthesized! + * Again, you can customize this if you need special linkage keywords. + */ + +#ifdef HAVE_PROTOTYPES +#define JMETHOD(type,methodname,arglist) type (*methodname) arglist +#else +#define JMETHOD(type,methodname,arglist) type (*methodname) () +#endif + + +/* Here is the pseudo-keyword for declaring pointers that must be "far" + * on 80x86 machines. Most of the specialized coding for 80x86 is handled + * by just saying "FAR *" where such a pointer is needed. In a few places + * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. + */ + +#ifndef FAR +#ifdef NEED_FAR_POINTERS +#define FAR far +#else +#define FAR +#endif +#endif + + +/* + * On a few systems, type boolean and/or its values FALSE, TRUE may appear + * in standard header files. Or you may have conflicts with application- + * specific header files that you want to include together with these files. + * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. + */ + +#ifndef HAVE_BOOLEAN +typedef int boolean; +#endif +#ifndef FALSE /* in case these macros already exist */ +#define FALSE 0 /* values of boolean */ +#endif +#ifndef TRUE +#define TRUE 1 +#endif + + +/* + * The remaining options affect code selection within the JPEG library, + * but they don't need to be visible to most applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. + */ + +#ifdef JPEG_INTERNALS +#define JPEG_INTERNAL_OPTIONS +#endif + +#ifdef JPEG_INTERNAL_OPTIONS + + +/* + * These defines indicate whether to include various optional functions. + * Undefining some of these symbols will produce a smaller but less capable + * library. Note that you can leave certain source files out of the + * compilation/linking process if you've #undef'd the corresponding symbols. + * (You may HAVE to do that if your compiler doesn't like null source files.) + */ + +/* Capability options common to encoder and decoder: */ + +#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ +#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ +#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ + +/* Encoder capability options: */ + +#define C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/ +#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ +/* Note: if you selected 12-bit data precision, it is dangerous to turn off + * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit + * precision, so jchuff.c normally uses entropy optimization to compute + * usable tables for higher precision. If you don't want to do optimization, + * you'll have to supply different default Huffman tables. + * The exact same statements apply for progressive JPEG: the default tables + * don't work for progressive mode. (This may get fixed, however.) + */ +#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ + +/* Decoder capability options: */ + +#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ +#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ +#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ +#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ +#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ +#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ +#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ + +/* more capability options later, no doubt */ + + +/* + * Ordering of RGB data in scanlines passed to or from the application. + * If your application wants to deal with data in the order B,G,R, just + * change these macros. You can also deal with formats such as R,G,B,X + * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing + * the offsets will also change the order in which colormap data is organized. + * RESTRICTIONS: + * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. + * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not + * useful if you are using JPEG color spaces other than YCbCr or grayscale. + * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE + * is not 3 (they don't understand about dummy color components!). So you + * can't use color quantization if you change that value. + */ + +#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ +#define RGB_GREEN 1 /* Offset of Green */ +#define RGB_BLUE 2 /* Offset of Blue */ +#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ + + +/* Definitions for speed-related optimizations. */ + + +/* If your compiler supports inline functions, define INLINE + * as the inline keyword; otherwise define it as empty. + */ + +#ifndef INLINE +#ifdef __GNUC__ /* for instance, GNU C knows about inline */ +#define INLINE __inline__ +#endif +#ifndef INLINE +#define INLINE /* default is to define it as empty */ +#endif +#endif + + +/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying + * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER + * as short on such a machine. MULTIPLIER must be at least 16 bits wide. + */ + +#ifndef MULTIPLIER +#define MULTIPLIER int /* type for fastest integer multiply */ +#endif + + +/* FAST_FLOAT should be either float or double, whichever is done faster + * by your compiler. (Note that this type is only used in the floating point + * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) + * Typically, float is faster in ANSI C compilers, while double is faster in + * pre-ANSI compilers (because they insist on converting to double anyway). + * The code below therefore chooses float if we have ANSI-style prototypes. + */ + +#ifndef FAST_FLOAT +#ifdef HAVE_PROTOTYPES +#define FAST_FLOAT float +#else +#define FAST_FLOAT double +#endif +#endif + +#endif /* JPEG_INTERNAL_OPTIONS */ diff --git a/jpeg-8c/jpegint.h b/jpeg-8c/jpegint.h new file mode 100644 index 00000000..0c27a4e4 --- /dev/null +++ b/jpeg-8c/jpegint.h @@ -0,0 +1,407 @@ +/* + * jpegint.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 1997-2009 by Guido Vollbeding. + * 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) */ +typedef JMETHOD(void, forward_DCT_ptr, + (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY sample_data, JBLOCKROW coef_blocks, + JDIMENSION start_row, JDIMENSION start_col, + JDIMENSION num_blocks)); + +struct jpeg_forward_dct { + JMETHOD(void, start_pass, (j_compress_ptr cinfo)); + /* It is useful to allow each component to have a separate FDCT method. */ + forward_DCT_ptr forward_DCT[MAX_COMPONENTS]; +}; + +/* 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)); +}; + +/* 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_arith_encoder jIAEncoder +#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_arith_decoder jIADecoder +#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 +#define jpeg_natural_order7 jZAGTable7 +#define jpeg_natural_order6 jZAGTable6 +#define jpeg_natural_order5 jZAGTable5 +#define jpeg_natural_order4 jZAGTable4 +#define jpeg_natural_order3 jZAGTable3 +#define jpeg_natural_order2 jZAGTable2 +#define jpeg_aritab jAriTab +#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_arith_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_arith_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 */ +extern const int jpeg_natural_order7[]; /* zz to natural order for 7x7 block */ +extern const int jpeg_natural_order6[]; /* zz to natural order for 6x6 block */ +extern const int jpeg_natural_order5[]; /* zz to natural order for 5x5 block */ +extern const int jpeg_natural_order4[]; /* zz to natural order for 4x4 block */ +extern const int jpeg_natural_order3[]; /* zz to natural order for 3x3 block */ +extern const int jpeg_natural_order2[]; /* zz to natural order for 2x2 block */ + +/* Arithmetic coding probability estimation tables in jaricom.c */ +extern const INT32 jpeg_aritab[]; + +/* 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/jpeg-8c/jpeglib.h b/jpeg-8c/jpeglib.h new file mode 100644 index 00000000..1eb1fac0 --- /dev/null +++ b/jpeg-8c/jpeglib.h @@ -0,0 +1,1160 @@ +/* + * jpeglib.h + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2002-2010 by Guido Vollbeding. + * 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 application interface for the JPEG library. + * Most applications using the library need only include this file, + * and perhaps jerror.h if they want to know the exact error codes. + */ + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +/* + * First we include the configuration files that record how this + * installation of the JPEG library is set up. jconfig.h can be + * generated automatically for many systems. jmorecfg.h contains + * manual configuration options that most people need not worry about. + */ + +#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ +#include "jconfig.h" /* widely used configuration options */ +#endif +#include "jmorecfg.h" /* seldom changed options */ + + +#ifdef __cplusplus +#ifndef DONT_USE_EXTERN_C +extern "C" { +#endif +#endif + +/* Version IDs for the JPEG library. + * Might be useful for tests like "#if JPEG_LIB_VERSION >= 80". + */ + +#define JPEG_LIB_VERSION 80 /* Compatibility version 8.0 */ +#define JPEG_LIB_VERSION_MAJOR 8 +#define JPEG_LIB_VERSION_MINOR 3 + + +/* Various constants determining the sizes of things. + * All of these are specified by the JPEG standard, so don't change them + * if you want to be compatible. + */ + +#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ +#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ +#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ +#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ +#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ +#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ +#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ +/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; + * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. + * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU + * to handle it. We even let you do this from the jconfig.h file. However, + * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe + * sometimes emits noncompliant files doesn't mean you should too. + */ +#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ +#ifndef D_MAX_BLOCKS_IN_MCU +#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ +#endif + + +/* Data structures for images (arrays of samples and of DCT coefficients). + * On 80x86 machines, the image arrays are too big for near pointers, + * but the pointer arrays can fit in near memory. + */ + +typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ +typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ +typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ + +typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ +typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ +typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ +typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ + +typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ + + +/* Types for JPEG compression parameters and working tables. */ + + +/* DCT coefficient quantization tables. */ + +typedef struct { + /* This array gives the coefficient quantizers in natural array order + * (not the zigzag order in which they are stored in a JPEG DQT marker). + * CAUTION: IJG versions prior to v6a kept this array in zigzag order. + */ + UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JQUANT_TBL; + + +/* Huffman coding tables. */ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ + /* length k bits; bits[0] is unused */ + UINT8 huffval[256]; /* The symbols, in order of incr code length */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JHUFF_TBL; + + +/* Basic info about one component (color channel). */ + +typedef struct { + /* These values are fixed over the whole image. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOF marker. */ + int component_id; /* identifier for this component (0..255) */ + int component_index; /* its index in SOF or cinfo->comp_info[] */ + int h_samp_factor; /* horizontal sampling factor (1..4) */ + int v_samp_factor; /* vertical sampling factor (1..4) */ + int quant_tbl_no; /* quantization table selector (0..3) */ + /* These values may vary between scans. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOS marker. */ + /* The decompressor output side may not use these variables. */ + int dc_tbl_no; /* DC entropy table selector (0..3) */ + int ac_tbl_no; /* AC entropy table selector (0..3) */ + + /* Remaining fields should be treated as private by applications. */ + + /* These values are computed during compression or decompression startup: */ + /* Component's size in DCT blocks. + * Any dummy blocks added to complete an MCU are not counted; therefore + * these values do not depend on whether a scan is interleaved or not. + */ + JDIMENSION width_in_blocks; + JDIMENSION height_in_blocks; + /* Size of a DCT block in samples, + * reflecting any scaling we choose to apply during the DCT step. + * Values from 1 to 16 are supported. + * Note that different components may receive different DCT scalings. + */ + int DCT_h_scaled_size; + int DCT_v_scaled_size; + /* The downsampled dimensions are the component's actual, unpadded number + * of samples at the main buffer (preprocessing/compression interface); + * DCT scaling is included, so + * downsampled_width = ceil(image_width * Hi/Hmax * DCT_h_scaled_size/DCTSIZE) + * and similarly for height. + */ + JDIMENSION downsampled_width; /* actual width in samples */ + JDIMENSION downsampled_height; /* actual height in samples */ + /* This flag is used only for decompression. In cases where some of the + * components will be ignored (eg grayscale output from YCbCr image), + * we can skip most computations for the unused components. + */ + boolean component_needed; /* do we need the value of this component? */ + + /* These values are computed before starting a scan of the component. */ + /* The decompressor output side may not use these variables. */ + int MCU_width; /* number of blocks per MCU, horizontally */ + int MCU_height; /* number of blocks per MCU, vertically */ + int MCU_blocks; /* MCU_width * MCU_height */ + int MCU_sample_width; /* MCU width in samples: MCU_width * DCT_h_scaled_size */ + int last_col_width; /* # of non-dummy blocks across in last MCU */ + int last_row_height; /* # of non-dummy blocks down in last MCU */ + + /* Saved quantization table for component; NULL if none yet saved. + * See jdinput.c comments about the need for this information. + * This field is currently used only for decompression. + */ + JQUANT_TBL * quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void * dct_table; +} jpeg_component_info; + + +/* The script for encoding a multiple-scan file is an array of these: */ + +typedef struct { + int comps_in_scan; /* number of components encoded in this scan */ + int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ + int Ss, Se; /* progressive JPEG spectral selection parms */ + int Ah, Al; /* progressive JPEG successive approx. parms */ +} jpeg_scan_info; + +/* The decompressor can save APPn and COM markers in a list of these: */ + +typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; + +struct jpeg_marker_struct { + jpeg_saved_marker_ptr next; /* next in list, or NULL */ + UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ + unsigned int original_length; /* # bytes of data in the file */ + unsigned int data_length; /* # bytes of data saved at data[] */ + JOCTET FAR * data; /* the data contained in the marker */ + /* the marker length word is not counted in data_length or original_length */ +}; + +/* Known color spaces. */ + +typedef enum { + JCS_UNKNOWN, /* error/unspecified */ + JCS_GRAYSCALE, /* monochrome */ + JCS_RGB, /* red/green/blue */ + JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ + JCS_CMYK, /* C/M/Y/K */ + JCS_YCCK /* Y/Cb/Cr/K */ +} J_COLOR_SPACE; + +/* DCT/IDCT algorithm options. */ + +typedef enum { + JDCT_ISLOW, /* slow but accurate integer algorithm */ + JDCT_IFAST, /* faster, less accurate integer method */ + JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ +} J_DCT_METHOD; + +#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ +#define JDCT_DEFAULT JDCT_ISLOW +#endif +#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ +#define JDCT_FASTEST JDCT_IFAST +#endif + +/* Dithering options for decompression. */ + +typedef enum { + JDITHER_NONE, /* no dithering */ + JDITHER_ORDERED, /* simple ordered dither */ + JDITHER_FS /* Floyd-Steinberg error diffusion dither */ +} J_DITHER_MODE; + + +/* Common fields between JPEG compression and decompression master structs. */ + +#define jpeg_common_fields \ + struct jpeg_error_mgr * err; /* Error handler module */\ + struct jpeg_memory_mgr * mem; /* Memory manager module */\ + struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ + void * client_data; /* Available for use by application */\ + boolean is_decompressor; /* So common code can tell which is which */\ + int global_state /* For checking call sequence validity */ + +/* Routines that are to be used by both halves of the library are declared + * to receive a pointer to this structure. There are no actual instances of + * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. + */ +struct jpeg_common_struct { + jpeg_common_fields; /* Fields common to both master struct types */ + /* Additional fields follow in an actual jpeg_compress_struct or + * jpeg_decompress_struct. All three structs must agree on these + * initial fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct jpeg_common_struct * j_common_ptr; +typedef struct jpeg_compress_struct * j_compress_ptr; +typedef struct jpeg_decompress_struct * j_decompress_ptr; + + +/* Master record for a compression instance */ + +struct jpeg_compress_struct { + jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ + + /* Destination for compressed data */ + struct jpeg_destination_mgr * dest; + + /* Description of source image --- these fields must be filled in by + * outer application before starting compression. in_color_space must + * be correct before you can even call jpeg_set_defaults(). + */ + + JDIMENSION image_width; /* input image width */ + JDIMENSION image_height; /* input image height */ + int input_components; /* # of color components in input image */ + J_COLOR_SPACE in_color_space; /* colorspace of input image */ + + double input_gamma; /* image gamma of input image */ + + /* Compression parameters --- these fields must be set before calling + * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + * initialize everything to reasonable defaults, then changing anything + * the application specifically wants to change. That way you won't get + * burnt when new parameters are added. Also note that there are several + * helper routines to simplify changing parameters. + */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + JDIMENSION jpeg_width; /* scaled JPEG image width */ + JDIMENSION jpeg_height; /* scaled JPEG image height */ + /* Dimensions of actual JPEG image that will be written to file, + * derived from input dimensions by scaling factors above. + * These fields are computed by jpeg_start_compress(). + * You can also use jpeg_calc_jpeg_dimensions() to determine these values + * in advance of calling jpeg_start_compress(). + */ + + int data_precision; /* bits of precision in image data */ + + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + int q_scale_factor[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined, + * and corresponding scale factors (percentage, initialized 100). + */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + int num_scans; /* # of entries in scan_info array */ + const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ + /* The default value of scan_info is NULL, which causes a single-scan + * sequential JPEG file to be emitted. To create a multi-scan file, + * set num_scans and scan_info to point to an array of scan definitions. + */ + + boolean raw_data_in; /* TRUE=caller supplies downsampled data */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + boolean do_fancy_downsampling; /* TRUE=apply fancy downsampling */ + int smoothing_factor; /* 1..100, or 0 for no input smoothing */ + J_DCT_METHOD dct_method; /* DCT algorithm selector */ + + /* The restart interval can be specified in absolute MCUs by setting + * restart_interval, or in MCU rows by setting restart_in_rows + * (in which case the correct restart_interval will be figured + * for each scan). + */ + unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ + int restart_in_rows; /* if > 0, MCU rows per restart interval */ + + /* Parameters controlling emission of special markers. */ + + boolean write_JFIF_header; /* should a JFIF marker be written? */ + UINT8 JFIF_major_version; /* What to write for the JFIF version number */ + UINT8 JFIF_minor_version; + /* These three values are not used by the JPEG code, merely copied */ + /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ + /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ + /* ratio is defined by X_density/Y_density even when density_unit=0. */ + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean write_Adobe_marker; /* should an Adobe marker be written? */ + + /* State variable: index of next scanline to be written to + * jpeg_write_scanlines(). Application may use this to control its + * processing loop, e.g., "while (next_scanline < image_height)". + */ + + JDIMENSION next_scanline; /* 0 .. image_height-1 */ + + /* Remaining fields are known throughout compressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during compression startup + */ + boolean progressive_mode; /* TRUE if scan script uses progressive mode */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ + int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ + /* The coefficient controller receives data in units of MCU rows as defined + * for fully interleaved scans (whether the JPEG file is interleaved or not). + * There are v_samp_factor * DCTSIZE sample rows of each component in an + * "iMCU" (interleaved MCU) row. + */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[C_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + int block_size; /* the basic DCT block size: 1..16 */ + const int * natural_order; /* natural-order position array */ + int lim_Se; /* min( Se, DCTSIZE2-1 ) */ + + /* + * Links to compression subobjects (methods and private variables of modules) + */ + struct jpeg_comp_master * master; + struct jpeg_c_main_controller * main; + struct jpeg_c_prep_controller * prep; + struct jpeg_c_coef_controller * coef; + struct jpeg_marker_writer * marker; + struct jpeg_color_converter * cconvert; + struct jpeg_downsampler * downsample; + struct jpeg_forward_dct * fdct; + struct jpeg_entropy_encoder * entropy; + jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ + int script_space_size; +}; + + +/* Master record for a decompression instance */ + +struct jpeg_decompress_struct { + jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ + + /* Source of compressed data */ + struct jpeg_source_mgr * src; + + /* Basic description of image --- filled in by jpeg_read_header(). */ + /* Application may inspect these values to decide how to process image. */ + + JDIMENSION image_width; /* nominal image width (from SOF marker) */ + JDIMENSION image_height; /* nominal image height */ + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + /* Decompression processing parameters --- these fields must be set before + * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes + * them to default values. + */ + + J_COLOR_SPACE out_color_space; /* colorspace for output */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + double output_gamma; /* image gamma wanted in output */ + + boolean buffered_image; /* TRUE=multiple output passes */ + boolean raw_data_out; /* TRUE=downsampled data wanted */ + + J_DCT_METHOD dct_method; /* IDCT algorithm selector */ + boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ + boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ + + boolean quantize_colors; /* TRUE=colormapped output wanted */ + /* the following are ignored if not quantize_colors: */ + J_DITHER_MODE dither_mode; /* type of color dithering to use */ + boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ + int desired_number_of_colors; /* max # colors to use in created colormap */ + /* these are significant only in buffered-image mode: */ + boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ + boolean enable_external_quant;/* enable future use of external colormap */ + boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ + + /* Description of actual output image that will be returned to application. + * These fields are computed by jpeg_start_decompress(). + * You can also use jpeg_calc_output_dimensions() to determine these values + * in advance of calling jpeg_start_decompress(). + */ + + JDIMENSION output_width; /* scaled image width */ + JDIMENSION output_height; /* scaled image height */ + int out_color_components; /* # of color components in out_color_space */ + int output_components; /* # of color components returned */ + /* output_components is 1 (a colormap index) when quantizing colors; + * otherwise it equals out_color_components. + */ + int rec_outbuf_height; /* min recommended height of scanline buffer */ + /* If the buffer passed to jpeg_read_scanlines() is less than this many rows + * high, space and time will be wasted due to unnecessary data copying. + * Usually rec_outbuf_height will be 1 or 2, at most 4. + */ + + /* When quantizing colors, the output colormap is described by these fields. + * The application can supply a colormap by setting colormap non-NULL before + * calling jpeg_start_decompress; otherwise a colormap is created during + * jpeg_start_decompress or jpeg_start_output. + * The map has out_color_components rows and actual_number_of_colors columns. + */ + int actual_number_of_colors; /* number of entries in use */ + JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ + + /* State variables: these variables indicate the progress of decompression. + * The application may examine these but must not modify them. + */ + + /* Row index of next scanline to be read from jpeg_read_scanlines(). + * Application may use this to control its processing loop, e.g., + * "while (output_scanline < output_height)". + */ + JDIMENSION output_scanline; /* 0 .. output_height-1 */ + + /* Current input scan number and number of iMCU rows completed in scan. + * These indicate the progress of the decompressor input side. + */ + int input_scan_number; /* Number of SOS markers seen so far */ + JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ + + /* The "output scan number" is the notional scan being displayed by the + * output side. The decompressor will not allow output scan/row number + * to get ahead of input scan/row, but it can fall arbitrarily far behind. + */ + int output_scan_number; /* Nominal scan number being displayed */ + JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ + + /* Current progression status. coef_bits[c][i] indicates the precision + * with which component c's DCT coefficient i (in zigzag order) is known. + * It is -1 when no data has yet been received, otherwise it is the point + * transform (shift) value for the most recent scan of the coefficient + * (thus, 0 at completion of the progression). + * This pointer is NULL when reading a non-progressive file. + */ + int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ + + /* Internal JPEG parameters --- the application usually need not look at + * these fields. Note that the decompressor output side may not use + * any parameters that can change between scans. + */ + + /* Quantization and Huffman tables are carried forward across input + * datastreams when processing abbreviated JPEG datastreams. + */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + /* These parameters are never carried across datastreams, since they + * are given in SOF/SOS markers or defined to be reset by SOI. + */ + + int data_precision; /* bits of precision in image data */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + boolean is_baseline; /* TRUE if Baseline SOF0 encountered */ + boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ + + /* These fields record data obtained from optional markers recognized by + * the JPEG library. + */ + boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ + /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ + UINT8 JFIF_major_version; /* JFIF version number */ + UINT8 JFIF_minor_version; + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ + UINT8 Adobe_transform; /* Color transform code from Adobe marker */ + + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + + /* Aside from the specific data retained from APPn markers known to the + * library, the uninterpreted contents of any or all APPn and COM markers + * can be saved in a list for examination by the application. + */ + jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ + + /* Remaining fields are known throughout decompressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during decompression startup + */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ + int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ + /* The coefficient controller's input and output progress is measured in + * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows + * in fully interleaved JPEG scans, but are used whether the scan is + * interleaved or not. We define an iMCU row as v_samp_factor DCT block + * rows of each component. Therefore, the IDCT output contains + * v_samp_factor*DCT_v_scaled_size sample rows of a component per iMCU row. + */ + + JSAMPLE * sample_range_limit; /* table for fast range-limiting */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + * Note that the decompressor output side must not use these fields. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[D_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* These fields are derived from Se of first SOS marker. + */ + int block_size; /* the basic DCT block size: 1..16 */ + const int * natural_order; /* natural-order position array for entropy decode */ + int lim_Se; /* min( Se, DCTSIZE2-1 ) for entropy decode */ + + /* This field is shared between entropy decoder and marker parser. + * It is either zero or the code of a JPEG marker that has been + * read from the data source, but has not yet been processed. + */ + int unread_marker; + + /* + * Links to decompression subobjects (methods, private variables of modules) + */ + struct jpeg_decomp_master * master; + struct jpeg_d_main_controller * main; + struct jpeg_d_coef_controller * coef; + struct jpeg_d_post_controller * post; + struct jpeg_input_controller * inputctl; + struct jpeg_marker_reader * marker; + struct jpeg_entropy_decoder * entropy; + struct jpeg_inverse_dct * idct; + struct jpeg_upsampler * upsample; + struct jpeg_color_deconverter * cconvert; + struct jpeg_color_quantizer * cquantize; +}; + + +/* "Object" declarations for JPEG modules that may be supplied or called + * directly by the surrounding application. + * As with all objects in the JPEG library, these structs only define the + * publicly visible methods and state variables of a module. Additional + * private fields may exist after the public ones. + */ + + +/* Error handler object */ + +struct jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + JMETHOD(void, error_exit, (j_common_ptr cinfo)); + /* Conditionally emit a trace or warning message */ + JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); + /* Routine that actually outputs a trace or error message */ + JMETHOD(void, output_message, (j_common_ptr cinfo)); + /* Format a message string for the most recent JPEG error or message */ + JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); +#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ + /* Reset error state variables at start of a new image */ + JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); + + /* The message ID code and any parameters are saved here. + * A message can have one string parameter or up to 8 int parameters. + */ + int msg_code; +#define JMSG_STR_PARM_MAX 80 + union { + int i[8]; + char s[JMSG_STR_PARM_MAX]; + } msg_parm; + + /* Standard state variables for error facility */ + + int trace_level; /* max msg_level that will be displayed */ + + /* For recoverable corrupt-data errors, we emit a warning message, + * but keep going unless emit_message chooses to abort. emit_message + * should count warnings in num_warnings. The surrounding application + * can check for bad data by seeing if num_warnings is nonzero at the + * end of processing. + */ + long num_warnings; /* number of corrupt-data warnings */ + + /* These fields point to the table(s) of error message strings. + * An application can change the table pointer to switch to a different + * message list (typically, to change the language in which errors are + * reported). Some applications may wish to add additional error codes + * that will be handled by the JPEG library error mechanism; the second + * table pointer is used for this purpose. + * + * First table includes all errors generated by JPEG library itself. + * Error code 0 is reserved for a "no such error string" message. + */ + const char * const * jpeg_message_table; /* Library errors */ + int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ + /* Second table can be added by application (see cjpeg/djpeg for example). + * It contains strings numbered first_addon_message..last_addon_message. + */ + const char * const * addon_message_table; /* Non-library errors */ + int first_addon_message; /* code for first string in addon table */ + int last_addon_message; /* code for last string in addon table */ +}; + + +/* Progress monitor object */ + +struct jpeg_progress_mgr { + JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); + + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +}; + + +/* Data destination object for compression */ + +struct jpeg_destination_mgr { + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + + JMETHOD(void, init_destination, (j_compress_ptr cinfo)); + JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); + JMETHOD(void, term_destination, (j_compress_ptr cinfo)); +}; + + +/* Data source object for decompression */ + +struct jpeg_source_mgr { + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + + JMETHOD(void, init_source, (j_decompress_ptr cinfo)); + JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); + JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); + JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); + JMETHOD(void, term_source, (j_decompress_ptr cinfo)); +}; + + +/* Memory manager object. + * Allocates "small" objects (a few K total), "large" objects (tens of K), + * and "really big" objects (virtual arrays with backing store if needed). + * The memory manager does not allow individual objects to be freed; rather, + * each created object is assigned to a pool, and whole pools can be freed + * at once. This is faster and more convenient than remembering exactly what + * to free, especially where malloc()/free() are not too speedy. + * NB: alloc routines never return NULL. They exit to error_exit if not + * successful. + */ + +#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ +#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ +#define JPOOL_NUMPOOLS 2 + +typedef struct jvirt_sarray_control * jvirt_sarray_ptr; +typedef struct jvirt_barray_control * jvirt_barray_ptr; + + +struct jpeg_memory_mgr { + /* Method pointers */ + JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, + JDIMENSION samplesperrow, + JDIMENSION numrows)); + JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, + JDIMENSION blocksperrow, + JDIMENSION numrows)); + JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION samplesperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION blocksperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); + JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, + jvirt_sarray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, + jvirt_barray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); + JMETHOD(void, self_destruct, (j_common_ptr cinfo)); + + /* Limit on memory allocation for this JPEG object. (Note that this is + * merely advisory, not a guaranteed maximum; it only affects the space + * used for virtual-array buffers.) May be changed by outer application + * after creating the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + + +/* Routine signature for application-supplied marker processing methods. + * Need not pass marker code since it is stored in cinfo->unread_marker. + */ +typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); + + +/* Declarations for routines called by application. + * The JPP macro hides prototype parameters from compilers that can't cope. + * Note JPP requires double parentheses. + */ + +#ifdef HAVE_PROTOTYPES +#define JPP(arglist) arglist +#else +#define JPP(arglist) () +#endif + + +/* Short forms of external names for systems with brain-damaged linkers. + * We shorten external names to be unique in the first six letters, which + * is good enough for all known systems. + * (If your compiler itself needs names to be unique in less than 15 + * characters, you are out of luck. Get a better compiler.) + */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_std_error jStdError +#define jpeg_CreateCompress jCreaCompress +#define jpeg_CreateDecompress jCreaDecompress +#define jpeg_destroy_compress jDestCompress +#define jpeg_destroy_decompress jDestDecompress +#define jpeg_stdio_dest jStdDest +#define jpeg_stdio_src jStdSrc +#define jpeg_mem_dest jMemDest +#define jpeg_mem_src jMemSrc +#define jpeg_set_defaults jSetDefaults +#define jpeg_set_colorspace jSetColorspace +#define jpeg_default_colorspace jDefColorspace +#define jpeg_set_quality jSetQuality +#define jpeg_set_linear_quality jSetLQuality +#define jpeg_default_qtables jDefQTables +#define jpeg_add_quant_table jAddQuantTable +#define jpeg_quality_scaling jQualityScaling +#define jpeg_simple_progression jSimProgress +#define jpeg_suppress_tables jSuppressTables +#define jpeg_alloc_quant_table jAlcQTable +#define jpeg_alloc_huff_table jAlcHTable +#define jpeg_start_compress jStrtCompress +#define jpeg_write_scanlines jWrtScanlines +#define jpeg_finish_compress jFinCompress +#define jpeg_calc_jpeg_dimensions jCjpegDimensions +#define jpeg_write_raw_data jWrtRawData +#define jpeg_write_marker jWrtMarker +#define jpeg_write_m_header jWrtMHeader +#define jpeg_write_m_byte jWrtMByte +#define jpeg_write_tables jWrtTables +#define jpeg_read_header jReadHeader +#define jpeg_start_decompress jStrtDecompress +#define jpeg_read_scanlines jReadScanlines +#define jpeg_finish_decompress jFinDecompress +#define jpeg_read_raw_data jReadRawData +#define jpeg_has_multiple_scans jHasMultScn +#define jpeg_start_output jStrtOutput +#define jpeg_finish_output jFinOutput +#define jpeg_input_complete jInComplete +#define jpeg_new_colormap jNewCMap +#define jpeg_consume_input jConsumeInput +#define jpeg_core_output_dimensions jCoreDimensions +#define jpeg_calc_output_dimensions jCalcDimensions +#define jpeg_save_markers jSaveMarkers +#define jpeg_set_marker_processor jSetMarker +#define jpeg_read_coefficients jReadCoefs +#define jpeg_write_coefficients jWrtCoefs +#define jpeg_copy_critical_parameters jCopyCrit +#define jpeg_abort_compress jAbrtCompress +#define jpeg_abort_decompress jAbrtDecompress +#define jpeg_abort jAbort +#define jpeg_destroy jDestroy +#define jpeg_resync_to_restart jResyncRestart +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* Default error-management setup */ +EXTERN(struct jpeg_error_mgr *) jpeg_std_error + JPP((struct jpeg_error_mgr * err)); + +/* Initialization of JPEG compression objects. + * jpeg_create_compress() and jpeg_create_decompress() are the exported + * names that applications should call. These expand to calls on + * jpeg_CreateCompress and jpeg_CreateDecompress with additional information + * passed for version mismatch checking. + * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. + */ +#define jpeg_create_compress(cinfo) \ + jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_compress_struct)) +#define jpeg_create_decompress(cinfo) \ + jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_decompress_struct)) +EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, + int version, size_t structsize)); +EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, + int version, size_t structsize)); +/* Destruction of JPEG compression objects */ +EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); + +/* Standard data source and destination managers: stdio streams. */ +/* Caller is responsible for opening the file before and closing after. */ +EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); +EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); + +/* Data source and destination managers: memory buffers. */ +EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo, + unsigned char ** outbuffer, + unsigned long * outsize)); +EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo, + unsigned char * inbuffer, + unsigned long insize)); + +/* Default parameter setup for compression */ +EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); +/* Compression parameter setup aids */ +EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, + J_COLOR_SPACE colorspace)); +EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, + boolean force_baseline)); +EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, + int scale_factor, + boolean force_baseline)); +EXTERN(void) jpeg_default_qtables JPP((j_compress_ptr cinfo, + boolean force_baseline)); +EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, + boolean force_baseline)); +EXTERN(int) jpeg_quality_scaling JPP((int quality)); +EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, + boolean suppress)); +EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); +EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); + +/* Main entry points for compression */ +EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, + boolean write_all_tables)); +EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION num_lines)); +EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); + +/* Precalculate JPEG dimensions for current compression parameters. */ +EXTERN(void) jpeg_calc_jpeg_dimensions JPP((j_compress_ptr cinfo)); + +/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION num_lines)); + +/* Write a special marker. See libjpeg.txt concerning safe usage. */ +EXTERN(void) jpeg_write_marker + JPP((j_compress_ptr cinfo, int marker, + const JOCTET * dataptr, unsigned int datalen)); +/* Same, but piecemeal. */ +EXTERN(void) jpeg_write_m_header + JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); +EXTERN(void) jpeg_write_m_byte + JPP((j_compress_ptr cinfo, int val)); + +/* Alternate compression function: just write an abbreviated table file */ +EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); + +/* Decompression startup: read start of JPEG datastream to see what's there */ +EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, + boolean require_image)); +/* Return value is one of: */ +#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ +#define JPEG_HEADER_OK 1 /* Found valid image datastream */ +#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ +/* If you pass require_image = TRUE (normal case), you need not check for + * a TABLES_ONLY return code; an abbreviated file will cause an error exit. + * JPEG_SUSPENDED is only possible if you use a data source module that can + * give a suspension return (the stdio source module doesn't). + */ + +/* Main entry points for decompression */ +EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); +EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION max_lines)); +EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); + +/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION max_lines)); + +/* Additional entry points for buffered-image mode. */ +EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, + int scan_number)); +EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); +EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); +/* Return value is one of: */ +/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ +#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ +#define JPEG_REACHED_EOI 2 /* Reached end of image */ +#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ +#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ + +/* Precalculate output dimensions for current decompression parameters. */ +EXTERN(void) jpeg_core_output_dimensions JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); + +/* Control saving of COM and APPn markers into marker_list. */ +EXTERN(void) jpeg_save_markers + JPP((j_decompress_ptr cinfo, int marker_code, + unsigned int length_limit)); + +/* Install a special processing method for COM or APPn markers. */ +EXTERN(void) jpeg_set_marker_processor + JPP((j_decompress_ptr cinfo, int marker_code, + jpeg_marker_parser_method routine)); + +/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ +EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays)); +EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, + j_compress_ptr dstinfo)); + +/* If you choose to abort compression or decompression before completing + * jpeg_finish_(de)compress, then you need to clean up to release memory, + * temporary files, etc. You can just call jpeg_destroy_(de)compress + * if you're done with the JPEG object, but if you want to clean it up and + * reuse it, call this: + */ +EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); + +/* Generic versions of jpeg_abort and jpeg_destroy that work on either + * flavor of JPEG object. These may be more convenient in some places. + */ +EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); +EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); + +/* Default restart-marker-resync procedure for use by data source modules */ +EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, + int desired)); + + +/* These marker codes are exported since applications and data source modules + * are likely to want to use them. + */ + +#define JPEG_RST0 0xD0 /* RST0 marker code */ +#define JPEG_EOI 0xD9 /* EOI marker code */ +#define JPEG_APP0 0xE0 /* APP0 marker code */ +#define JPEG_COM 0xFE /* COM marker code */ + + +/* If we have a brain-damaged compiler that emits warnings (or worse, errors) + * for structure definitions that are never filled in, keep it quiet by + * supplying dummy definitions for the various substructures. + */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ +struct jvirt_sarray_control { long dummy; }; +struct jvirt_barray_control { long dummy; }; +struct jpeg_comp_master { long dummy; }; +struct jpeg_c_main_controller { long dummy; }; +struct jpeg_c_prep_controller { long dummy; }; +struct jpeg_c_coef_controller { long dummy; }; +struct jpeg_marker_writer { long dummy; }; +struct jpeg_color_converter { long dummy; }; +struct jpeg_downsampler { long dummy; }; +struct jpeg_forward_dct { long dummy; }; +struct jpeg_entropy_encoder { long dummy; }; +struct jpeg_decomp_master { long dummy; }; +struct jpeg_d_main_controller { long dummy; }; +struct jpeg_d_coef_controller { long dummy; }; +struct jpeg_d_post_controller { long dummy; }; +struct jpeg_input_controller { long dummy; }; +struct jpeg_marker_reader { long dummy; }; +struct jpeg_entropy_decoder { long dummy; }; +struct jpeg_inverse_dct { long dummy; }; +struct jpeg_upsampler { long dummy; }; +struct jpeg_color_deconverter { long dummy; }; +struct jpeg_color_quantizer { long dummy; }; +#endif /* JPEG_INTERNALS */ +#endif /* INCOMPLETE_TYPES_BROKEN */ + + +/* + * The JPEG library modules define JPEG_INTERNALS before including this file. + * The internal structure declarations are read only when that is true. + * Applications using the library should not include jpegint.h, but may wish + * to include jerror.h. + */ + +#ifdef JPEG_INTERNALS +#include "jpegint.h" /* fetch private declarations */ +#include "jerror.h" /* fetch error codes too */ +#endif + +#ifdef __cplusplus +#ifndef DONT_USE_EXTERN_C +} +#endif +#endif + +#endif /* JPEGLIB_H */ diff --git a/jpeg-8c/jpegtran b/jpeg-8c/jpegtran new file mode 100755 index 00000000..90265311 --- /dev/null +++ b/jpeg-8c/jpegtran @@ -0,0 +1,225 @@ +#! /bin/bash + +# jpegtran - temporary wrapper script for .libs/jpegtran +# Generated by libtool (GNU libtool) 2.4 +# +# The jpegtran program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command="(cd /home/www/proj/jpeg-8c; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH; gcc -std=gnu99 -g -O2 -o \$progdir/\$file jpegtran.o rdswitch.o cdjpeg.o transupp.o ./.libs/libjpeg.so -Wl,-rpath -Wl,/home/www/proj/jpeg-8c/.libs)" + +# This environment variable determines our operation mode. +if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then + # install mode needs the following variables: + generated_by_libtool_version='2.4' + notinst_deplibs=' libjpeg.la' +else + # When we are sourced in execute mode, $file and $ECHO are already set. + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + file="$0" + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + ECHO="printf %s\\n" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string --lt- +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's ./libtool value, followed by no. +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=$0 + shift + for lt_opt + do + case "$lt_opt" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'` + test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=. + lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'` + cat "$lt_dump_D/$lt_dump_F" + exit 0 + ;; + --lt-*) + $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n "$lt_option_debug"; then + echo "jpegtran:jpegtran:${LINENO}: libtool wrapper (GNU libtool) 2.4" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + $ECHO "jpegtran:jpegtran:${LINENO}: newargv[$lt_dump_args_N]: $lt_arg" + lt_dump_args_N=`expr $lt_dump_args_N + 1` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ + + if test -n "$lt_option_debug"; then + $ECHO "jpegtran:jpegtran:${LINENO}: newargv[0]: $progdir/$program" 1>&2 + func_lt_dump_args ${1+"$@"} 1>&2 + fi + exec "$progdir/$program" ${1+"$@"} + + $ECHO "$0: cannot exec $program $*" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from $@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + for lt_wr_arg + do + case $lt_wr_arg in + --lt-*) ;; + *) set x "$@" "$lt_wr_arg"; shift;; + esac + shift + done + func_exec_program_core ${1+"$@"} +} + + # Parse options + func_parse_lt_options "$0" ${1+"$@"} + + # Find the directory that this script lives in. + thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'` + test "x$thisdir" = "x$file" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'` + while test -n "$file"; do + destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'` + + # If there was a directory component, then change thisdir. + if test "x$destdir" != "x$file"; then + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;; + *) thisdir="$thisdir/$destdir" ;; + esac + fi + + file=`$ECHO "$file" | /bin/sed 's%^.*/%%'` + file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no + if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then + # special case for '.' + if test "$thisdir" = "."; then + thisdir=`pwd` + fi + # remove .libs from thisdir + case "$thisdir" in + *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;; + .libs ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=`cd "$thisdir" && pwd` + test -n "$absdir" && thisdir="$absdir" + + program=lt-'jpegtran' + progdir="$thisdir/.libs" + + if test ! -f "$progdir/$program" || + { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \ + test "X$file" != "X$progdir/$program"; }; then + + file="$$-$program" + + if test ! -d "$progdir"; then + mkdir "$progdir" + else + rm -f "$progdir/$file" + fi + + # relink executable if necessary + if test -n "$relink_command"; then + if relink_command_output=`eval $relink_command 2>&1`; then : + else + printf %s\n "$relink_command_output" >&2 + rm -f "$progdir/$file" + exit 1 + fi + fi + + mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null || + { rm -f "$progdir/$program"; + mv -f "$progdir/$file" "$progdir/$program"; } + rm -f "$progdir/$file" + fi + + if test -f "$progdir/$program"; then + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + # Run the actual program with our arguments. + func_exec_program ${1+"$@"} + fi + else + # The program doesn't exist. + $ECHO "$0: error: \`$progdir/$program' does not exist" 1>&2 + $ECHO "This script is just a wrapper for $program." 1>&2 + $ECHO "See the libtool documentation for more information." 1>&2 + exit 1 + fi +fi diff --git a/jpeg-8c/jpegtran.1 b/jpeg-8c/jpegtran.1 new file mode 100644 index 00000000..0ad1bbc8 --- /dev/null +++ b/jpeg-8c/jpegtran.1 @@ -0,0 +1,285 @@ +.TH JPEGTRAN 1 "28 December 2009" +.SH NAME +jpegtran \- lossless transformation of JPEG files +.SH SYNOPSIS +.B jpegtran +[ +.I options +] +[ +.I filename +] +.LP +.SH DESCRIPTION +.LP +.B jpegtran +performs various useful transformations of JPEG files. +It can translate the coded representation from one variant of JPEG to another, +for example from baseline JPEG to progressive JPEG or vice versa. It can also +perform some rearrangements of the image data, for example turning an image +from landscape to portrait format by rotation. +.PP +.B jpegtran +works by rearranging the compressed data (DCT coefficients), without +ever fully decoding the image. Therefore, its transformations are lossless: +there is no image degradation at all, which would not be true if you used +.B djpeg +followed by +.B cjpeg +to accomplish the same conversion. But by the same token, +.B jpegtran +cannot perform lossy operations such as changing the image quality. +.PP +.B jpegtran +reads the named JPEG/JFIF file, or the standard input if no file is +named, and produces a JPEG/JFIF file on the standard output. +.SH OPTIONS +All switch names may be abbreviated; for example, +.B \-optimize +may be written +.B \-opt +or +.BR \-o . +Upper and lower case are equivalent. +British spellings are also accepted (e.g., +.BR \-optimise ), +though for brevity these are not mentioned below. +.PP +To specify the coded JPEG representation used in the output file, +.B jpegtran +accepts a subset of the switches recognized by +.BR cjpeg : +.TP +.B \-optimize +Perform optimization of entropy encoding parameters. +.TP +.B \-progressive +Create progressive JPEG file. +.TP +.BI \-restart " N" +Emit a JPEG restart marker every N MCU rows, or every N MCU blocks if "B" is +attached to the number. +.TP +.B \-arithmetic +Use arithmetic coding. +.TP +.BI \-scans " file" +Use the scan script given in the specified text file. +.PP +See +.BR cjpeg (1) +for more details about these switches. +If you specify none of these switches, you get a plain baseline-JPEG output +file. The quality setting and so forth are determined by the input file. +.PP +The image can be losslessly transformed by giving one of these switches: +.TP +.B \-flip horizontal +Mirror image horizontally (left-right). +.TP +.B \-flip vertical +Mirror image vertically (top-bottom). +.TP +.B \-rotate 90 +Rotate image 90 degrees clockwise. +.TP +.B \-rotate 180 +Rotate image 180 degrees. +.TP +.B \-rotate 270 +Rotate image 270 degrees clockwise (or 90 ccw). +.TP +.B \-transpose +Transpose image (across UL-to-LR axis). +.TP +.B \-transverse +Transverse transpose (across UR-to-LL axis). +.IP +The transpose transformation has no restrictions regarding image dimensions. +The other transformations operate rather oddly if the image dimensions are not +a multiple of the iMCU size (usually 8 or 16 pixels), because they can only +transform complete blocks of DCT coefficient data in the desired way. +.IP +.BR jpegtran 's +default behavior when transforming an odd-size image is designed +to preserve exact reversibility and mathematical consistency of the +transformation set. As stated, transpose is able to flip the entire image +area. Horizontal mirroring leaves any partial iMCU column at the right edge +untouched, but is able to flip all rows of the image. Similarly, vertical +mirroring leaves any partial iMCU row at the bottom edge untouched, but is +able to flip all columns. The other transforms can be built up as sequences +of transpose and flip operations; for consistency, their actions on edge +pixels are defined to be the same as the end result of the corresponding +transpose-and-flip sequence. +.IP +For practical use, you may prefer to discard any untransformable edge pixels +rather than having a strange-looking strip along the right and/or bottom edges +of a transformed image. To do this, add the +.B \-trim +switch: +.TP +.B \-trim +Drop non-transformable edge blocks. +.IP +Obviously, a transformation with +.B \-trim +is not reversible, so strictly speaking +.B jpegtran +with this switch is not lossless. Also, the expected mathematical +equivalences between the transformations no longer hold. For example, +.B \-rot 270 -trim +trims only the bottom edge, but +.B \-rot 90 -trim +followed by +.B \-rot 180 -trim +trims both edges. +.IP +If you are only interested in perfect transformation, add the +.B \-perfect +switch: +.TP +.B \-perfect +Fails with an error if the transformation is not perfect. +.IP +For example you may want to do +.IP +.B (jpegtran \-rot 90 -perfect +.I foo.jpg +.B || djpeg +.I foo.jpg +.B | pnmflip \-r90 | cjpeg) +.IP +to do a perfect rotation if available or an approximated one if not. +.PP +We also offer a lossless-crop option, which discards data outside a given +image region but losslessly preserves what is inside. Like the rotate and +flip transforms, lossless crop is restricted by the current JPEG format: the +upper left corner of the selected region must fall on an iMCU boundary. If +this does not hold for the given crop parameters, we silently move the upper +left corner up and/or left to make it so, simultaneously increasing the region +dimensions to keep the lower right crop corner unchanged. (Thus, the output +image covers at least the requested region, but may cover more.) + +The image can be losslessly cropped by giving the switch: +.TP +.B \-crop WxH+X+Y +Crop to a rectangular subarea of width W, height H starting at point X,Y. +.PP +Other not-strictly-lossless transformation switches are: +.TP +.B \-grayscale +Force grayscale output. +.IP +This option discards the chrominance channels if the input image is YCbCr +(ie, a standard color JPEG), resulting in a grayscale JPEG file. The +luminance channel is preserved exactly, so this is a better method of reducing +to grayscale than decompression, conversion, and recompression. This switch +is particularly handy for fixing a monochrome picture that was mistakenly +encoded as a color JPEG. (In such a case, the space savings from getting rid +of the near-empty chroma channels won't be large; but the decoding time for +a grayscale JPEG is substantially less than that for a color JPEG.) +.TP +.BI \-scale " M/N" +Scale the output image by a factor M/N. +.IP +Currently supported scale factors are M/N with all M from 1 to 16, where N is +the source DCT size, which is 8 for baseline JPEG. If the /N part is omitted, +then M specifies the DCT scaled size to be applied on the given input. For +baseline JPEG this is equivalent to M/8 scaling, since the source DCT size +for baseline JPEG is 8. +.B Caution: +An implementation of the JPEG SmartScale extension is required for this +feature. SmartScale enabled JPEG is not yet widely implemented, so many +decoders will be unable to view a SmartScale extended JPEG file at all. +.PP +.B jpegtran +also recognizes these switches that control what to do with "extra" markers, +such as comment blocks: +.TP +.B \-copy none +Copy no extra markers from source file. This setting suppresses all +comments and other excess baggage present in the source file. +.TP +.B \-copy comments +Copy only comment markers. This setting copies comments from the source file, +but discards any other inessential (for image display) data. +.TP +.B \-copy all +Copy all extra markers. This setting preserves miscellaneous markers +found in the source file, such as JFIF thumbnails, Exif data, and Photoshop +settings. In some files these extra markers can be sizable. +.IP +The default behavior is +.BR "\-copy comments" . +(Note: in IJG releases v6 and v6a, +.B jpegtran +always did the equivalent of +.BR "\-copy none" .) +.PP +Additional switches recognized by jpegtran are: +.TP +.BI \-maxmemory " N" +Set limit for amount of memory to use in processing large images. Value is +in thousands of bytes, or millions of bytes if "M" is attached to the +number. For example, +.B \-max 4m +selects 4000000 bytes. If more space is needed, temporary files will be used. +.TP +.BI \-outfile " name" +Send output image to the named file, not to standard output. +.TP +.B \-verbose +Enable debug printout. More +.BR \-v 's +give more output. Also, version information is printed at startup. +.TP +.B \-debug +Same as +.BR \-verbose . +.SH EXAMPLES +.LP +This example converts a baseline JPEG file to progressive form: +.IP +.B jpegtran \-progressive +.I foo.jpg +.B > +.I fooprog.jpg +.PP +This example rotates an image 90 degrees clockwise, discarding any +unrotatable edge pixels: +.IP +.B jpegtran \-rot 90 -trim +.I foo.jpg +.B > +.I foo90.jpg +.SH ENVIRONMENT +.TP +.B JPEGMEM +If this environment variable is set, its value is the default memory limit. +The value is specified as described for the +.B \-maxmemory +switch. +.B JPEGMEM +overrides the default value specified when the program was compiled, and +itself is overridden by an explicit +.BR \-maxmemory . +.SH SEE ALSO +.BR cjpeg (1), +.BR djpeg (1), +.BR rdjpgcom (1), +.BR wrjpgcom (1) +.br +Wallace, Gregory K. "The JPEG Still Picture Compression Standard", +Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44. +.SH AUTHOR +Independent JPEG Group +.SH BUGS +The transform options can't transform odd-size images perfectly. Use +.B \-trim +or +.B \-perfect +if you don't like the results. +.PP +The entire image is read into memory and then written out again, even in +cases where this isn't really necessary. Expect swapping on large images, +especially when using the more complex transform options. diff --git a/jpeg-8c/jpegtran.c b/jpeg-8c/jpegtran.c new file mode 100644 index 00000000..8cb3d807 --- /dev/null +++ b/jpeg-8c/jpegtran.c @@ -0,0 +1,560 @@ +/* + * jpegtran.c + * + * Copyright (C) 1995-2010, Thomas G. Lane, Guido Vollbeding. + * 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 command-line user interface for JPEG transcoding. + * It is very similar to cjpeg.c, and partly to djpeg.c, but provides + * lossless transcoding between different JPEG file formats. It also + * provides some lossless and sort-of-lossless transformations of JPEG data. + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ +#include "transupp.h" /* Support routines for jpegtran */ +#include "jversion.h" /* for version message */ + +#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ +#ifdef __MWERKS__ +#include /* Metrowerks needs this */ +#include /* ... and this */ +#endif +#ifdef THINK_C +#include /* Think declares it here */ +#endif +#endif + + +/* + * Argument-parsing code. + * The switch parser is designed to be useful with DOS-style command line + * syntax, ie, intermixed switches and file names, where only the switches + * to the left of a given file name affect processing of that file. + * The main program in this file doesn't actually use this capability... + */ + + +static const char * progname; /* program name for error messages */ +static char * outfilename; /* for -outfile switch */ +static char * scaleoption; /* -scale switch */ +static JCOPY_OPTION copyoption; /* -copy switch */ +static jpeg_transform_info transformoption; /* image transformation options */ + + +LOCAL(void) +usage (void) +/* complain about bad command line */ +{ + fprintf(stderr, "usage: %s [switches] ", progname); +#ifdef TWO_FILE_COMMANDLINE + fprintf(stderr, "inputfile outputfile\n"); +#else + fprintf(stderr, "[inputfile]\n"); +#endif + + fprintf(stderr, "Switches (names may be abbreviated):\n"); + fprintf(stderr, " -copy none Copy no extra markers from source file\n"); + fprintf(stderr, " -copy comments Copy only comment markers (default)\n"); + fprintf(stderr, " -copy all Copy all extra markers\n"); +#ifdef ENTROPY_OPT_SUPPORTED + fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n"); +#endif +#ifdef C_PROGRESSIVE_SUPPORTED + fprintf(stderr, " -progressive Create progressive JPEG file\n"); +#endif + fprintf(stderr, "Switches for modifying the image:\n"); +#if TRANSFORMS_SUPPORTED + fprintf(stderr, " -crop WxH+X+Y Crop to a rectangular subarea\n"); + fprintf(stderr, " -grayscale Reduce to grayscale (omit color data)\n"); + fprintf(stderr, " -flip [horizontal|vertical] Mirror image (left-right or top-bottom)\n"); + fprintf(stderr, " -perfect Fail if there is non-transformable edge blocks\n"); + fprintf(stderr, " -rotate [90|180|270] Rotate image (degrees clockwise)\n"); +#endif + fprintf(stderr, " -scale M/N Scale output image by fraction M/N, eg, 1/8\n"); +#if TRANSFORMS_SUPPORTED + fprintf(stderr, " -transpose Transpose image\n"); + fprintf(stderr, " -transverse Transverse transpose image\n"); + fprintf(stderr, " -trim Drop non-transformable edge blocks\n"); +#endif + fprintf(stderr, "Switches for advanced users:\n"); + fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n"); + fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n"); + fprintf(stderr, " -outfile name Specify name for output file\n"); + fprintf(stderr, " -verbose or -debug Emit debug output\n"); + fprintf(stderr, "Switches for wizards:\n"); +#ifdef C_ARITH_CODING_SUPPORTED + fprintf(stderr, " -arithmetic Use arithmetic coding\n"); +#endif +#ifdef C_MULTISCAN_FILES_SUPPORTED + fprintf(stderr, " -scans file Create multi-scan JPEG per script file\n"); +#endif + exit(EXIT_FAILURE); +} + + +LOCAL(void) +select_transform (JXFORM_CODE transform) +/* Silly little routine to detect multiple transform options, + * which we can't handle. + */ +{ +#if TRANSFORMS_SUPPORTED + if (transformoption.transform == JXFORM_NONE || + transformoption.transform == transform) { + transformoption.transform = transform; + } else { + fprintf(stderr, "%s: can only do one image transformation at a time\n", + progname); + usage(); + } +#else + fprintf(stderr, "%s: sorry, image transformation was not compiled\n", + progname); + exit(EXIT_FAILURE); +#endif +} + + +LOCAL(int) +parse_switches (j_compress_ptr cinfo, int argc, char **argv, + int last_file_arg_seen, boolean for_real) +/* Parse optional switches. + * Returns argv[] index of first file-name argument (== argc if none). + * Any file names with indexes <= last_file_arg_seen are ignored; + * they have presumably been processed in a previous iteration. + * (Pass 0 for last_file_arg_seen on the first or only iteration.) + * for_real is FALSE on the first (dummy) pass; we may skip any expensive + * processing. + */ +{ + int argn; + char * arg; + boolean simple_progressive; + char * scansarg = NULL; /* saves -scans parm if any */ + + /* Set up default JPEG parameters. */ + simple_progressive = FALSE; + outfilename = NULL; + scaleoption = NULL; + copyoption = JCOPYOPT_DEFAULT; + transformoption.transform = JXFORM_NONE; + transformoption.perfect = FALSE; + transformoption.trim = FALSE; + transformoption.force_grayscale = FALSE; + transformoption.crop = FALSE; + cinfo->err->trace_level = 0; + + /* Scan command line options, adjust parameters */ + + for (argn = 1; argn < argc; argn++) { + arg = argv[argn]; + if (*arg != '-') { + /* Not a switch, must be a file name argument */ + if (argn <= last_file_arg_seen) { + outfilename = NULL; /* -outfile applies to just one input file */ + continue; /* ignore this name if previously processed */ + } + break; /* else done parsing switches */ + } + arg++; /* advance past switch marker character */ + + if (keymatch(arg, "arithmetic", 1)) { + /* Use arithmetic coding. */ +#ifdef C_ARITH_CODING_SUPPORTED + cinfo->arith_code = TRUE; +#else + fprintf(stderr, "%s: sorry, arithmetic coding not supported\n", + progname); + exit(EXIT_FAILURE); +#endif + + } else if (keymatch(arg, "copy", 2)) { + /* Select which extra markers to copy. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + if (keymatch(argv[argn], "none", 1)) { + copyoption = JCOPYOPT_NONE; + } else if (keymatch(argv[argn], "comments", 1)) { + copyoption = JCOPYOPT_COMMENTS; + } else if (keymatch(argv[argn], "all", 1)) { + copyoption = JCOPYOPT_ALL; + } else + usage(); + + } else if (keymatch(arg, "crop", 2)) { + /* Perform lossless cropping. */ +#if TRANSFORMS_SUPPORTED + if (++argn >= argc) /* advance to next argument */ + usage(); + if (! jtransform_parse_crop_spec(&transformoption, argv[argn])) { + fprintf(stderr, "%s: bogus -crop argument '%s'\n", + progname, argv[argn]); + exit(EXIT_FAILURE); + } +#else + select_transform(JXFORM_NONE); /* force an error */ +#endif + + } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { + /* Enable debug printouts. */ + /* On first -d, print version identification */ + static boolean printed_version = FALSE; + + if (! printed_version) { + fprintf(stderr, "Independent JPEG Group's JPEGTRAN, version %s\n%s\n", + JVERSION, JCOPYRIGHT); + printed_version = TRUE; + } + cinfo->err->trace_level++; + + } else if (keymatch(arg, "flip", 1)) { + /* Mirror left-right or top-bottom. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + if (keymatch(argv[argn], "horizontal", 1)) + select_transform(JXFORM_FLIP_H); + else if (keymatch(argv[argn], "vertical", 1)) + select_transform(JXFORM_FLIP_V); + else + usage(); + + } else if (keymatch(arg, "grayscale", 1) || keymatch(arg, "greyscale",1)) { + /* Force to grayscale. */ +#if TRANSFORMS_SUPPORTED + transformoption.force_grayscale = TRUE; +#else + select_transform(JXFORM_NONE); /* force an error */ +#endif + + } else if (keymatch(arg, "maxmemory", 3)) { + /* Maximum memory in Kb (or Mb with 'm'). */ + long lval; + char ch = 'x'; + + if (++argn >= argc) /* advance to next argument */ + usage(); + if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) + usage(); + if (ch == 'm' || ch == 'M') + lval *= 1000L; + cinfo->mem->max_memory_to_use = lval * 1000L; + + } else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) { + /* Enable entropy parm optimization. */ +#ifdef ENTROPY_OPT_SUPPORTED + cinfo->optimize_coding = TRUE; +#else + fprintf(stderr, "%s: sorry, entropy optimization was not compiled\n", + progname); + exit(EXIT_FAILURE); +#endif + + } else if (keymatch(arg, "outfile", 4)) { + /* Set output file name. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + outfilename = argv[argn]; /* save it away for later use */ + + } else if (keymatch(arg, "perfect", 2)) { + /* Fail if there is any partial edge MCUs that the transform can't + * handle. */ + transformoption.perfect = TRUE; + + } else if (keymatch(arg, "progressive", 2)) { + /* Select simple progressive mode. */ +#ifdef C_PROGRESSIVE_SUPPORTED + simple_progressive = TRUE; + /* We must postpone execution until num_components is known. */ +#else + fprintf(stderr, "%s: sorry, progressive output was not compiled\n", + progname); + exit(EXIT_FAILURE); +#endif + + } else if (keymatch(arg, "restart", 1)) { + /* Restart interval in MCU rows (or in MCUs with 'b'). */ + long lval; + char ch = 'x'; + + if (++argn >= argc) /* advance to next argument */ + usage(); + if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) + usage(); + if (lval < 0 || lval > 65535L) + usage(); + if (ch == 'b' || ch == 'B') { + cinfo->restart_interval = (unsigned int) lval; + cinfo->restart_in_rows = 0; /* else prior '-restart n' overrides me */ + } else { + cinfo->restart_in_rows = (int) lval; + /* restart_interval will be computed during startup */ + } + + } else if (keymatch(arg, "rotate", 2)) { + /* Rotate 90, 180, or 270 degrees (measured clockwise). */ + if (++argn >= argc) /* advance to next argument */ + usage(); + if (keymatch(argv[argn], "90", 2)) + select_transform(JXFORM_ROT_90); + else if (keymatch(argv[argn], "180", 3)) + select_transform(JXFORM_ROT_180); + else if (keymatch(argv[argn], "270", 3)) + select_transform(JXFORM_ROT_270); + else + usage(); + + } else if (keymatch(arg, "scale", 4)) { + /* Scale the output image by a fraction M/N. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + scaleoption = argv[argn]; + /* We must postpone processing until decompression startup. */ + + } else if (keymatch(arg, "scans", 1)) { + /* Set scan script. */ +#ifdef C_MULTISCAN_FILES_SUPPORTED + if (++argn >= argc) /* advance to next argument */ + usage(); + scansarg = argv[argn]; + /* We must postpone reading the file in case -progressive appears. */ +#else + fprintf(stderr, "%s: sorry, multi-scan output was not compiled\n", + progname); + exit(EXIT_FAILURE); +#endif + + } else if (keymatch(arg, "transpose", 1)) { + /* Transpose (across UL-to-LR axis). */ + select_transform(JXFORM_TRANSPOSE); + + } else if (keymatch(arg, "transverse", 6)) { + /* Transverse transpose (across UR-to-LL axis). */ + select_transform(JXFORM_TRANSVERSE); + + } else if (keymatch(arg, "trim", 3)) { + /* Trim off any partial edge MCUs that the transform can't handle. */ + transformoption.trim = TRUE; + + } else { + usage(); /* bogus switch */ + } + } + + /* Post-switch-scanning cleanup */ + + if (for_real) { + +#ifdef C_PROGRESSIVE_SUPPORTED + if (simple_progressive) /* process -progressive; -scans can override */ + jpeg_simple_progression(cinfo); +#endif + +#ifdef C_MULTISCAN_FILES_SUPPORTED + if (scansarg != NULL) /* process -scans if it was present */ + if (! read_scan_script(cinfo, scansarg)) + usage(); +#endif + } + + return argn; /* return index of next arg (file name) */ +} + + +/* + * The main program. + */ + +int +main (int argc, char **argv) +{ + struct jpeg_decompress_struct srcinfo; + struct jpeg_compress_struct dstinfo; + struct jpeg_error_mgr jsrcerr, jdsterr; +#ifdef PROGRESS_REPORT + struct cdjpeg_progress_mgr progress; +#endif + jvirt_barray_ptr * src_coef_arrays; + jvirt_barray_ptr * dst_coef_arrays; + int file_index; + /* We assume all-in-memory processing and can therefore use only a + * single file pointer for sequential input and output operation. + */ + FILE * fp; + + /* On Mac, fetch a command line. */ +#ifdef USE_CCOMMAND + argc = ccommand(&argv); +#endif + + progname = argv[0]; + if (progname == NULL || progname[0] == 0) + progname = "jpegtran"; /* in case C library doesn't provide it */ + + /* Initialize the JPEG decompression object with default error handling. */ + srcinfo.err = jpeg_std_error(&jsrcerr); + jpeg_create_decompress(&srcinfo); + /* Initialize the JPEG compression object with default error handling. */ + dstinfo.err = jpeg_std_error(&jdsterr); + jpeg_create_compress(&dstinfo); + + /* Now safe to enable signal catcher. + * Note: we assume only the decompression object will have virtual arrays. + */ +#ifdef NEED_SIGNAL_CATCHER + enable_signal_catcher((j_common_ptr) &srcinfo); +#endif + + /* Scan command line to find file names. + * It is convenient to use just one switch-parsing routine, but the switch + * values read here are mostly ignored; we will rescan the switches after + * opening the input file. Also note that most of the switches affect the + * destination JPEG object, so we parse into that and then copy over what + * needs to affects the source too. + */ + + file_index = parse_switches(&dstinfo, argc, argv, 0, FALSE); + jsrcerr.trace_level = jdsterr.trace_level; + srcinfo.mem->max_memory_to_use = dstinfo.mem->max_memory_to_use; + +#ifdef TWO_FILE_COMMANDLINE + /* Must have either -outfile switch or explicit output file name */ + if (outfilename == NULL) { + if (file_index != argc-2) { + fprintf(stderr, "%s: must name one input and one output file\n", + progname); + usage(); + } + outfilename = argv[file_index+1]; + } else { + if (file_index != argc-1) { + fprintf(stderr, "%s: must name one input and one output file\n", + progname); + usage(); + } + } +#else + /* Unix style: expect zero or one file name */ + if (file_index < argc-1) { + fprintf(stderr, "%s: only one input file\n", progname); + usage(); + } +#endif /* TWO_FILE_COMMANDLINE */ + + /* Open the input file. */ + if (file_index < argc) { + if ((fp = fopen(argv[file_index], READ_BINARY)) == NULL) { + fprintf(stderr, "%s: can't open %s for reading\n", progname, argv[file_index]); + exit(EXIT_FAILURE); + } + } else { + /* default input file is stdin */ + fp = read_stdin(); + } + +#ifdef PROGRESS_REPORT + start_progress_monitor((j_common_ptr) &dstinfo, &progress); +#endif + + /* Specify data source for decompression */ + jpeg_stdio_src(&srcinfo, fp); + + /* Enable saving of extra markers that we want to copy */ + jcopy_markers_setup(&srcinfo, copyoption); + + /* Read file header */ + (void) jpeg_read_header(&srcinfo, TRUE); + + /* Adjust default decompression parameters */ + if (scaleoption != NULL) + if (sscanf(scaleoption, "%d/%d", + &srcinfo.scale_num, &srcinfo.scale_denom) < 1) + usage(); + + /* Any space needed by a transform option must be requested before + * jpeg_read_coefficients so that memory allocation will be done right. + */ +#if TRANSFORMS_SUPPORTED + /* Fail right away if -perfect is given and transformation is not perfect. + */ + if (!jtransform_request_workspace(&srcinfo, &transformoption)) { + fprintf(stderr, "%s: transformation is not perfect\n", progname); + exit(EXIT_FAILURE); + } +#endif + + /* Read source file as DCT coefficients */ + src_coef_arrays = jpeg_read_coefficients(&srcinfo); + + /* Initialize destination compression parameters from source values */ + jpeg_copy_critical_parameters(&srcinfo, &dstinfo); + + /* Adjust destination parameters if required by transform options; + * also find out which set of coefficient arrays will hold the output. + */ +#if TRANSFORMS_SUPPORTED + dst_coef_arrays = jtransform_adjust_parameters(&srcinfo, &dstinfo, + src_coef_arrays, + &transformoption); +#else + dst_coef_arrays = src_coef_arrays; +#endif + + /* Close input file, if we opened it. + * Note: we assume that jpeg_read_coefficients consumed all input + * until JPEG_REACHED_EOI, and that jpeg_finish_decompress will + * only consume more while (! cinfo->inputctl->eoi_reached). + * We cannot call jpeg_finish_decompress here since we still need the + * virtual arrays allocated from the source object for processing. + */ + if (fp != stdin) + fclose(fp); + + /* Open the output file. */ + if (outfilename != NULL) { + if ((fp = fopen(outfilename, WRITE_BINARY)) == NULL) { + fprintf(stderr, "%s: can't open %s for writing\n", progname, outfilename); + exit(EXIT_FAILURE); + } + } else { + /* default output file is stdout */ + fp = write_stdout(); + } + + /* Adjust default compression parameters by re-parsing the options */ + file_index = parse_switches(&dstinfo, argc, argv, 0, TRUE); + + /* Specify data destination for compression */ + jpeg_stdio_dest(&dstinfo, fp); + + /* Start compressor (note no image data is actually written here) */ + jpeg_write_coefficients(&dstinfo, dst_coef_arrays); + + /* Copy to the output file any extra markers that we want to preserve */ + jcopy_markers_execute(&srcinfo, &dstinfo, copyoption); + + /* Execute image transformation, if any */ +#if TRANSFORMS_SUPPORTED + jtransform_execute_transformation(&srcinfo, &dstinfo, + src_coef_arrays, + &transformoption); +#endif + + /* Finish compression and release memory */ + jpeg_finish_compress(&dstinfo); + jpeg_destroy_compress(&dstinfo); + (void) jpeg_finish_decompress(&srcinfo); + jpeg_destroy_decompress(&srcinfo); + + /* Close output file, if we opened it */ + if (fp != stdout) + fclose(fp); + +#ifdef PROGRESS_REPORT + end_progress_monitor((j_common_ptr) &dstinfo); +#endif + + /* All done. */ + exit(jsrcerr.num_warnings + jdsterr.num_warnings ?EXIT_WARNING:EXIT_SUCCESS); + return 0; /* suppress no-return-value warnings */ +} diff --git a/jpeg-8c/jquant1.c b/jpeg-8c/jquant1.c new file mode 100644 index 00000000..b2f96aa1 --- /dev/null +++ b/jpeg-8c/jquant1.c @@ -0,0 +1,856 @@ +/* + * 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/jpeg-8c/jquant1.lo b/jpeg-8c/jquant1.lo new file mode 100644 index 00000000..9a2db951 --- /dev/null +++ b/jpeg-8c/jquant1.lo @@ -0,0 +1,12 @@ +# jquant1.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jquant1.o' + +# Name of the non-PIC object +non_pic_object='jquant1.o' + diff --git a/jpeg-8c/jquant2.c b/jpeg-8c/jquant2.c new file mode 100644 index 00000000..af601e33 --- /dev/null +++ b/jpeg-8c/jquant2.c @@ -0,0 +1,1310 @@ +/* + * 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/jpeg-8c/jquant2.lo b/jpeg-8c/jquant2.lo new file mode 100644 index 00000000..db0071c7 --- /dev/null +++ b/jpeg-8c/jquant2.lo @@ -0,0 +1,12 @@ +# jquant2.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jquant2.o' + +# Name of the non-PIC object +non_pic_object='jquant2.o' + diff --git a/jpeg-8c/jutils.c b/jpeg-8c/jutils.c new file mode 100644 index 00000000..04351797 --- /dev/null +++ b/jpeg-8c/jutils.c @@ -0,0 +1,231 @@ +/* + * jutils.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * 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 +}; + +const int jpeg_natural_order7[7*7+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, 14, 21, 28, 35, + 42, 49, 50, 43, 36, 29, 22, 30, + 37, 44, 51, 52, 45, 38, 46, 53, + 54, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order6[6*6+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 41, 34, 27, + 20, 13, 21, 28, 35, 42, 43, 36, + 29, 37, 44, 45, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order5[5*5+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 12, + 19, 26, 33, 34, 27, 20, 28, 35, + 36, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order4[4*4+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 25, 18, 11, 19, 26, 27, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order3[3*3+16] = { + 0, 1, 8, 16, 9, 2, 10, 17, + 18, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order2[2*2+16] = { + 0, 1, 8, 9, + 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/jpeg-8c/jutils.lo b/jpeg-8c/jutils.lo new file mode 100644 index 00000000..f39f759b --- /dev/null +++ b/jpeg-8c/jutils.lo @@ -0,0 +1,12 @@ +# jutils.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/jutils.o' + +# Name of the non-PIC object +non_pic_object='jutils.o' + diff --git a/jpeg-8c/jversion.h b/jpeg-8c/jversion.h new file mode 100644 index 00000000..e868538c --- /dev/null +++ b/jpeg-8c/jversion.h @@ -0,0 +1,14 @@ +/* + * jversion.h + * + * Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. + * 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 "8c 16-Jan-2011" + +#define JCOPYRIGHT "Copyright (C) 2011, Thomas G. Lane, Guido Vollbeding" diff --git a/jpeg-8c/libjpeg.la b/jpeg-8c/libjpeg.la new file mode 100644 index 00000000..b2429a40 --- /dev/null +++ b/jpeg-8c/libjpeg.la @@ -0,0 +1,41 @@ +# libjpeg.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libjpeg.so.8' + +# Names of this library. +library_names='libjpeg.so.8.3.0 libjpeg.so.8 libjpeg.so' + +# The name of the static archive. +old_library='libjpeg.a' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='' + +# Libraries that this one depends upon. +dependency_libs='' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libjpeg. +current=11 +age=3 +revision=0 + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/usr/local/lib' diff --git a/jpeg-8c/libjpeg.map b/jpeg-8c/libjpeg.map new file mode 100644 index 00000000..ac77dca7 --- /dev/null +++ b/jpeg-8c/libjpeg.map @@ -0,0 +1,4 @@ +LIBJPEG_8.0 { + global: + *; +}; diff --git a/jpeg-8c/libjpeg.txt b/jpeg-8c/libjpeg.txt new file mode 100644 index 00000000..2d98e22f --- /dev/null +++ b/jpeg-8c/libjpeg.txt @@ -0,0 +1,3084 @@ +USING THE IJG JPEG LIBRARY + +Copyright (C) 1994-2010, Thomas G. Lane, Guido Vollbeding. +This file is part of the Independent JPEG Group's software. +For conditions of distribution and use, see the accompanying README file. + + +This file describes how to use the IJG JPEG library within an application +program. Read it if you want to write a program that uses the library. + +The file example.c provides heavily commented skeleton code for calling the +JPEG library. Also see jpeglib.h (the include file to be used by application +programs) for full details about data structures and function parameter lists. +The library source code, of course, is the ultimate reference. + +Note that there have been *major* changes from the application interface +presented by IJG version 4 and earlier versions. The old design had several +inherent limitations, and it had accumulated a lot of cruft as we added +features while trying to minimize application-interface changes. We have +sacrificed backward compatibility in the version 5 rewrite, but we think the +improvements justify this. + + +TABLE OF CONTENTS +----------------- + +Overview: + Functions provided by the library + Outline of typical usage +Basic library usage: + Data formats + Compression details + Decompression details + Mechanics of usage: include files, linking, etc +Advanced features: + Compression parameter selection + Decompression parameter selection + Special color spaces + Error handling + Compressed data handling (source and destination managers) + I/O suspension + Progressive JPEG support + Buffered-image mode + Abbreviated datastreams and multiple images + Special markers + Raw (downsampled) image data + Really raw data: DCT coefficients + Progress monitoring + Memory management + Memory usage + Library compile-time options + Portability considerations + Notes for MS-DOS implementors + +You should read at least the overview and basic usage sections before trying +to program with the library. The sections on advanced features can be read +if and when you need them. + + +OVERVIEW +======== + +Functions provided by the library +--------------------------------- + +The IJG JPEG library provides C code to read and write JPEG-compressed image +files. The surrounding application program receives or supplies image data a +scanline at a time, using a straightforward uncompressed image format. All +details of color conversion and other preprocessing/postprocessing can be +handled by the library. + +The library includes a substantial amount of code that is not covered by the +JPEG standard but is necessary for typical applications of JPEG. These +functions preprocess the image before JPEG compression or postprocess it after +decompression. They include colorspace conversion, downsampling/upsampling, +and color quantization. The application indirectly selects use of this code +by specifying the format in which it wishes to supply or receive image data. +For example, if colormapped output is requested, then the decompression +library automatically invokes color quantization. + +A wide range of quality vs. speed tradeoffs are possible in JPEG processing, +and even more so in decompression postprocessing. The decompression library +provides multiple implementations that cover most of the useful tradeoffs, +ranging from very-high-quality down to fast-preview operation. On the +compression side we have generally not provided low-quality choices, since +compression is normally less time-critical. It should be understood that the +low-quality modes may not meet the JPEG standard's accuracy requirements; +nonetheless, they are useful for viewers. + +A word about functions *not* provided by the library. We handle a subset of +the ISO JPEG standard; most baseline, extended-sequential, and progressive +JPEG processes are supported. (Our subset includes all features now in common +use.) Unsupported ISO options include: + * Hierarchical storage + * Lossless JPEG + * DNL marker + * Nonintegral subsampling ratios +We support both 8- and 12-bit data precision, but this is a compile-time +choice rather than a run-time choice; hence it is difficult to use both +precisions in a single application. + +By itself, the library handles only interchange JPEG datastreams --- in +particular the widely used JFIF file format. The library can be used by +surrounding code to process interchange or abbreviated JPEG datastreams that +are embedded in more complex file formats. (For example, this library is +used by the free LIBTIFF library to support JPEG compression in TIFF.) + + +Outline of typical usage +------------------------ + +The rough outline of a JPEG compression operation is: + + Allocate and initialize a JPEG compression object + Specify the destination for the compressed data (eg, a file) + Set parameters for compression, including image size & colorspace + jpeg_start_compress(...); + while (scan lines remain to be written) + jpeg_write_scanlines(...); + jpeg_finish_compress(...); + Release the JPEG compression object + +A JPEG compression object holds parameters and working state for the JPEG +library. We make creation/destruction of the object separate from starting +or finishing compression of an image; the same object can be re-used for a +series of image compression operations. This makes it easy to re-use the +same parameter settings for a sequence of images. Re-use of a JPEG object +also has important implications for processing abbreviated JPEG datastreams, +as discussed later. + +The image data to be compressed is supplied to jpeg_write_scanlines() from +in-memory buffers. If the application is doing file-to-file compression, +reading image data from the source file is the application's responsibility. +The library emits compressed data by calling a "data destination manager", +which typically will write the data into a file; but the application can +provide its own destination manager to do something else. + +Similarly, the rough outline of a JPEG decompression operation is: + + Allocate and initialize a JPEG decompression object + Specify the source of the compressed data (eg, a file) + Call jpeg_read_header() to obtain image info + Set parameters for decompression + jpeg_start_decompress(...); + while (scan lines remain to be read) + jpeg_read_scanlines(...); + jpeg_finish_decompress(...); + Release the JPEG decompression object + +This is comparable to the compression outline except that reading the +datastream header is a separate step. This is helpful because information +about the image's size, colorspace, etc is available when the application +selects decompression parameters. For example, the application can choose an +output scaling ratio that will fit the image into the available screen size. + +The decompression library obtains compressed data by calling a data source +manager, which typically will read the data from a file; but other behaviors +can be obtained with a custom source manager. Decompressed data is delivered +into in-memory buffers passed to jpeg_read_scanlines(). + +It is possible to abort an incomplete compression or decompression operation +by calling jpeg_abort(); or, if you do not need to retain the JPEG object, +simply release it by calling jpeg_destroy(). + +JPEG compression and decompression objects are two separate struct types. +However, they share some common fields, and certain routines such as +jpeg_destroy() can work on either type of object. + +The JPEG library has no static variables: all state is in the compression +or decompression object. Therefore it is possible to process multiple +compression and decompression operations concurrently, using multiple JPEG +objects. + +Both compression and decompression can be done in an incremental memory-to- +memory fashion, if suitable source/destination managers are used. See the +section on "I/O suspension" for more details. + + +BASIC LIBRARY USAGE +=================== + +Data formats +------------ + +Before diving into procedural details, it is helpful to understand the +image data format that the JPEG library expects or returns. + +The standard input image format is a rectangular array of pixels, with each +pixel having the same number of "component" or "sample" values (color +channels). You must specify how many components there are and the colorspace +interpretation of the components. Most applications will use RGB data +(three components per pixel) or grayscale data (one component per pixel). +PLEASE NOTE THAT RGB DATA IS THREE SAMPLES PER PIXEL, GRAYSCALE ONLY ONE. +A remarkable number of people manage to miss this, only to find that their +programs don't work with grayscale JPEG files. + +There is no provision for colormapped input. JPEG files are always full-color +or full grayscale (or sometimes another colorspace such as CMYK). You can +feed in a colormapped image by expanding it to full-color format. However +JPEG often doesn't work very well with source data that has been colormapped, +because of dithering noise. This is discussed in more detail in the JPEG FAQ +and the other references mentioned in the README file. + +Pixels are stored by scanlines, with each scanline running from left to +right. The component values for each pixel are adjacent in the row; for +example, R,G,B,R,G,B,R,G,B,... for 24-bit RGB color. Each scanline is an +array of data type JSAMPLE --- which is typically "unsigned char", unless +you've changed jmorecfg.h. (You can also change the RGB pixel layout, say +to B,G,R order, by modifying jmorecfg.h. But see the restrictions listed in +that file before doing so.) + +A 2-D array of pixels is formed by making a list of pointers to the starts of +scanlines; so the scanlines need not be physically adjacent in memory. Even +if you process just one scanline at a time, you must make a one-element +pointer array to conform to this structure. Pointers to JSAMPLE rows are of +type JSAMPROW, and the pointer to the pointer array is of type JSAMPARRAY. + +The library accepts or supplies one or more complete scanlines per call. +It is not possible to process part of a row at a time. Scanlines are always +processed top-to-bottom. You can process an entire image in one call if you +have it all in memory, but usually it's simplest to process one scanline at +a time. + +For best results, source data values should have the precision specified by +BITS_IN_JSAMPLE (normally 8 bits). For instance, if you choose to compress +data that's only 6 bits/channel, you should left-justify each value in a +byte before passing it to the compressor. If you need to compress data +that has more than 8 bits/channel, compile with BITS_IN_JSAMPLE = 12. +(See "Library compile-time options", later.) + + +The data format returned by the decompressor is the same in all details, +except that colormapped output is supported. (Again, a JPEG file is never +colormapped. But you can ask the decompressor to perform on-the-fly color +quantization to deliver colormapped output.) If you request colormapped +output then the returned data array contains a single JSAMPLE per pixel; +its value is an index into a color map. The color map is represented as +a 2-D JSAMPARRAY in which each row holds the values of one color component, +that is, colormap[i][j] is the value of the i'th color component for pixel +value (map index) j. Note that since the colormap indexes are stored in +JSAMPLEs, the maximum number of colors is limited by the size of JSAMPLE +(ie, at most 256 colors for an 8-bit JPEG library). + + +Compression details +------------------- + +Here we revisit the JPEG compression outline given in the overview. + +1. Allocate and initialize a JPEG compression object. + +A JPEG compression object is a "struct jpeg_compress_struct". (It also has +a bunch of subsidiary structures which are allocated via malloc(), but the +application doesn't control those directly.) This struct can be just a local +variable in the calling routine, if a single routine is going to execute the +whole JPEG compression sequence. Otherwise it can be static or allocated +from malloc(). + +You will also need a structure representing a JPEG error handler. The part +of this that the library cares about is a "struct jpeg_error_mgr". If you +are providing your own error handler, you'll typically want to embed the +jpeg_error_mgr struct in a larger structure; this is discussed later under +"Error handling". For now we'll assume you are just using the default error +handler. The default error handler will print JPEG error/warning messages +on stderr, and it will call exit() if a fatal error occurs. + +You must initialize the error handler structure, store a pointer to it into +the JPEG object's "err" field, and then call jpeg_create_compress() to +initialize the rest of the JPEG object. + +Typical code for this step, if you are using the default error handler, is + + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; + ... + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_compress(&cinfo); + +jpeg_create_compress allocates a small amount of memory, so it could fail +if you are out of memory. In that case it will exit via the error handler; +that's why the error handler must be initialized first. + + +2. Specify the destination for the compressed data (eg, a file). + +As previously mentioned, the JPEG library delivers compressed data to a +"data destination" module. The library includes one data destination +module which knows how to write to a stdio stream. You can use your own +destination module if you want to do something else, as discussed later. + +If you use the standard destination module, you must open the target stdio +stream beforehand. Typical code for this step looks like: + + FILE * outfile; + ... + if ((outfile = fopen(filename, "wb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + exit(1); + } + jpeg_stdio_dest(&cinfo, outfile); + +where the last line invokes the standard destination module. + +WARNING: it is critical that the binary compressed data be delivered to the +output file unchanged. On non-Unix systems the stdio library may perform +newline translation or otherwise corrupt binary data. To suppress this +behavior, you may need to use a "b" option to fopen (as shown above), or use +setmode() or another routine to put the stdio stream in binary mode. See +cjpeg.c and djpeg.c for code that has been found to work on many systems. + +You can select the data destination after setting other parameters (step 3), +if that's more convenient. You may not change the destination between +calling jpeg_start_compress() and jpeg_finish_compress(). + + +3. Set parameters for compression, including image size & colorspace. + +You must supply information about the source image by setting the following +fields in the JPEG object (cinfo structure): + + image_width Width of image, in pixels + image_height Height of image, in pixels + input_components Number of color channels (samples per pixel) + in_color_space Color space of source image + +The image dimensions are, hopefully, obvious. JPEG supports image dimensions +of 1 to 64K pixels in either direction. The input color space is typically +RGB or grayscale, and input_components is 3 or 1 accordingly. (See "Special +color spaces", later, for more info.) The in_color_space field must be +assigned one of the J_COLOR_SPACE enum constants, typically JCS_RGB or +JCS_GRAYSCALE. + +JPEG has a large number of compression parameters that determine how the +image is encoded. Most applications don't need or want to know about all +these parameters. You can set all the parameters to reasonable defaults by +calling jpeg_set_defaults(); then, if there are particular values you want +to change, you can do so after that. The "Compression parameter selection" +section tells about all the parameters. + +You must set in_color_space correctly before calling jpeg_set_defaults(), +because the defaults depend on the source image colorspace. However the +other three source image parameters need not be valid until you call +jpeg_start_compress(). There's no harm in calling jpeg_set_defaults() more +than once, if that happens to be convenient. + +Typical code for a 24-bit RGB source image is + + cinfo.image_width = Width; /* image width and height, in pixels */ + cinfo.image_height = Height; + cinfo.input_components = 3; /* # of color components per pixel */ + cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ + + jpeg_set_defaults(&cinfo); + /* Make optional parameter settings here */ + + +4. jpeg_start_compress(...); + +After you have established the data destination and set all the necessary +source image info and other parameters, call jpeg_start_compress() to begin +a compression cycle. This will initialize internal state, allocate working +storage, and emit the first few bytes of the JPEG datastream header. + +Typical code: + + jpeg_start_compress(&cinfo, TRUE); + +The "TRUE" parameter ensures that a complete JPEG interchange datastream +will be written. This is appropriate in most cases. If you think you might +want to use an abbreviated datastream, read the section on abbreviated +datastreams, below. + +Once you have called jpeg_start_compress(), you may not alter any JPEG +parameters or other fields of the JPEG object until you have completed +the compression cycle. + + +5. while (scan lines remain to be written) + jpeg_write_scanlines(...); + +Now write all the required image data by calling jpeg_write_scanlines() +one or more times. You can pass one or more scanlines in each call, up +to the total image height. In most applications it is convenient to pass +just one or a few scanlines at a time. The expected format for the passed +data is discussed under "Data formats", above. + +Image data should be written in top-to-bottom scanline order. The JPEG spec +contains some weasel wording about how top and bottom are application-defined +terms (a curious interpretation of the English language...) but if you want +your files to be compatible with everyone else's, you WILL use top-to-bottom +order. If the source data must be read in bottom-to-top order, you can use +the JPEG library's virtual array mechanism to invert the data efficiently. +Examples of this can be found in the sample application cjpeg. + +The library maintains a count of the number of scanlines written so far +in the next_scanline field of the JPEG object. Usually you can just use +this variable as the loop counter, so that the loop test looks like +"while (cinfo.next_scanline < cinfo.image_height)". + +Code for this step depends heavily on the way that you store the source data. +example.c shows the following code for the case of a full-size 2-D source +array containing 3-byte RGB pixels: + + JSAMPROW row_pointer[1]; /* pointer to a single row */ + int row_stride; /* physical row width in buffer */ + + row_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */ + + while (cinfo.next_scanline < cinfo.image_height) { + row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; + jpeg_write_scanlines(&cinfo, row_pointer, 1); + } + +jpeg_write_scanlines() returns the number of scanlines actually written. +This will normally be equal to the number passed in, so you can usually +ignore the return value. It is different in just two cases: + * If you try to write more scanlines than the declared image height, + the additional scanlines are ignored. + * If you use a suspending data destination manager, output buffer overrun + will cause the compressor to return before accepting all the passed lines. + This feature is discussed under "I/O suspension", below. The normal + stdio destination manager will NOT cause this to happen. +In any case, the return value is the same as the change in the value of +next_scanline. + + +6. jpeg_finish_compress(...); + +After all the image data has been written, call jpeg_finish_compress() to +complete the compression cycle. This step is ESSENTIAL to ensure that the +last bufferload of data is written to the data destination. +jpeg_finish_compress() also releases working memory associated with the JPEG +object. + +Typical code: + + jpeg_finish_compress(&cinfo); + +If using the stdio destination manager, don't forget to close the output +stdio stream (if necessary) afterwards. + +If you have requested a multi-pass operating mode, such as Huffman code +optimization, jpeg_finish_compress() will perform the additional passes using +data buffered by the first pass. In this case jpeg_finish_compress() may take +quite a while to complete. With the default compression parameters, this will +not happen. + +It is an error to call jpeg_finish_compress() before writing the necessary +total number of scanlines. If you wish to abort compression, call +jpeg_abort() as discussed below. + +After completing a compression cycle, you may dispose of the JPEG object +as discussed next, or you may use it to compress another image. In that case +return to step 2, 3, or 4 as appropriate. If you do not change the +destination manager, the new datastream will be written to the same target. +If you do not change any JPEG parameters, the new datastream will be written +with the same parameters as before. Note that you can change the input image +dimensions freely between cycles, but if you change the input colorspace, you +should call jpeg_set_defaults() to adjust for the new colorspace; and then +you'll need to repeat all of step 3. + + +7. Release the JPEG compression object. + +When you are done with a JPEG compression object, destroy it by calling +jpeg_destroy_compress(). This will free all subsidiary memory (regardless of +the previous state of the object). Or you can call jpeg_destroy(), which +works for either compression or decompression objects --- this may be more +convenient if you are sharing code between compression and decompression +cases. (Actually, these routines are equivalent except for the declared type +of the passed pointer. To avoid gripes from ANSI C compilers, jpeg_destroy() +should be passed a j_common_ptr.) + +If you allocated the jpeg_compress_struct structure from malloc(), freeing +it is your responsibility --- jpeg_destroy() won't. Ditto for the error +handler structure. + +Typical code: + + jpeg_destroy_compress(&cinfo); + + +8. Aborting. + +If you decide to abort a compression cycle before finishing, you can clean up +in either of two ways: + +* If you don't need the JPEG object any more, just call + jpeg_destroy_compress() or jpeg_destroy() to release memory. This is + legitimate at any point after calling jpeg_create_compress() --- in fact, + it's safe even if jpeg_create_compress() fails. + +* If you want to re-use the JPEG object, call jpeg_abort_compress(), or call + jpeg_abort() which works on both compression and decompression objects. + This will return the object to an idle state, releasing any working memory. + jpeg_abort() is allowed at any time after successful object creation. + +Note that cleaning up the data destination, if required, is your +responsibility; neither of these routines will call term_destination(). +(See "Compressed data handling", below, for more about that.) + +jpeg_destroy() and jpeg_abort() are the only safe calls to make on a JPEG +object that has reported an error by calling error_exit (see "Error handling" +for more info). The internal state of such an object is likely to be out of +whack. Either of these two routines will return the object to a known state. + + +Decompression details +--------------------- + +Here we revisit the JPEG decompression outline given in the overview. + +1. Allocate and initialize a JPEG decompression object. + +This is just like initialization for compression, as discussed above, +except that the object is a "struct jpeg_decompress_struct" and you +call jpeg_create_decompress(). Error handling is exactly the same. + +Typical code: + + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + ... + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + +(Both here and in the IJG code, we usually use variable name "cinfo" for +both compression and decompression objects.) + + +2. Specify the source of the compressed data (eg, a file). + +As previously mentioned, the JPEG library reads compressed data from a "data +source" module. The library includes one data source module which knows how +to read from a stdio stream. You can use your own source module if you want +to do something else, as discussed later. + +If you use the standard source module, you must open the source stdio stream +beforehand. Typical code for this step looks like: + + FILE * infile; + ... + if ((infile = fopen(filename, "rb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + exit(1); + } + jpeg_stdio_src(&cinfo, infile); + +where the last line invokes the standard source module. + +WARNING: it is critical that the binary compressed data be read unchanged. +On non-Unix systems the stdio library may perform newline translation or +otherwise corrupt binary data. To suppress this behavior, you may need to use +a "b" option to fopen (as shown above), or use setmode() or another routine to +put the stdio stream in binary mode. See cjpeg.c and djpeg.c for code that +has been found to work on many systems. + +You may not change the data source between calling jpeg_read_header() and +jpeg_finish_decompress(). If you wish to read a series of JPEG images from +a single source file, you should repeat the jpeg_read_header() to +jpeg_finish_decompress() sequence without reinitializing either the JPEG +object or the data source module; this prevents buffered input data from +being discarded. + + +3. Call jpeg_read_header() to obtain image info. + +Typical code for this step is just + + jpeg_read_header(&cinfo, TRUE); + +This will read the source datastream header markers, up to the beginning +of the compressed data proper. On return, the image dimensions and other +info have been stored in the JPEG object. The application may wish to +consult this information before selecting decompression parameters. + +More complex code is necessary if + * A suspending data source is used --- in that case jpeg_read_header() + may return before it has read all the header data. See "I/O suspension", + below. The normal stdio source manager will NOT cause this to happen. + * Abbreviated JPEG files are to be processed --- see the section on + abbreviated datastreams. Standard applications that deal only in + interchange JPEG files need not be concerned with this case either. + +It is permissible to stop at this point if you just wanted to find out the +image dimensions and other header info for a JPEG file. In that case, +call jpeg_destroy() when you are done with the JPEG object, or call +jpeg_abort() to return it to an idle state before selecting a new data +source and reading another header. + + +4. Set parameters for decompression. + +jpeg_read_header() sets appropriate default decompression parameters based on +the properties of the image (in particular, its colorspace). However, you +may well want to alter these defaults before beginning the decompression. +For example, the default is to produce full color output from a color file. +If you want colormapped output you must ask for it. Other options allow the +returned image to be scaled and allow various speed/quality tradeoffs to be +selected. "Decompression parameter selection", below, gives details. + +If the defaults are appropriate, nothing need be done at this step. + +Note that all default values are set by each call to jpeg_read_header(). +If you reuse a decompression object, you cannot expect your parameter +settings to be preserved across cycles, as you can for compression. +You must set desired parameter values each time. + + +5. jpeg_start_decompress(...); + +Once the parameter values are satisfactory, call jpeg_start_decompress() to +begin decompression. This will initialize internal state, allocate working +memory, and prepare for returning data. + +Typical code is just + + jpeg_start_decompress(&cinfo); + +If you have requested a multi-pass operating mode, such as 2-pass color +quantization, jpeg_start_decompress() will do everything needed before data +output can begin. In this case jpeg_start_decompress() may take quite a while +to complete. With a single-scan (non progressive) JPEG file and default +decompression parameters, this will not happen; jpeg_start_decompress() will +return quickly. + +After this call, the final output image dimensions, including any requested +scaling, are available in the JPEG object; so is the selected colormap, if +colormapped output has been requested. Useful fields include + + output_width image width and height, as scaled + output_height + out_color_components # of color components in out_color_space + output_components # of color components returned per pixel + colormap the selected colormap, if any + actual_number_of_colors number of entries in colormap + +output_components is 1 (a colormap index) when quantizing colors; otherwise it +equals out_color_components. It is the number of JSAMPLE values that will be +emitted per pixel in the output arrays. + +Typically you will need to allocate data buffers to hold the incoming image. +You will need output_width * output_components JSAMPLEs per scanline in your +output buffer, and a total of output_height scanlines will be returned. + +Note: if you are using the JPEG library's internal memory manager to allocate +data buffers (as djpeg does), then the manager's protocol requires that you +request large buffers *before* calling jpeg_start_decompress(). This is a +little tricky since the output_XXX fields are not normally valid then. You +can make them valid by calling jpeg_calc_output_dimensions() after setting the +relevant parameters (scaling, output color space, and quantization flag). + + +6. while (scan lines remain to be read) + jpeg_read_scanlines(...); + +Now you can read the decompressed image data by calling jpeg_read_scanlines() +one or more times. At each call, you pass in the maximum number of scanlines +to be read (ie, the height of your working buffer); jpeg_read_scanlines() +will return up to that many lines. The return value is the number of lines +actually read. The format of the returned data is discussed under "Data +formats", above. Don't forget that grayscale and color JPEGs will return +different data formats! + +Image data is returned in top-to-bottom scanline order. If you must write +out the image in bottom-to-top order, you can use the JPEG library's virtual +array mechanism to invert the data efficiently. Examples of this can be +found in the sample application djpeg. + +The library maintains a count of the number of scanlines returned so far +in the output_scanline field of the JPEG object. Usually you can just use +this variable as the loop counter, so that the loop test looks like +"while (cinfo.output_scanline < cinfo.output_height)". (Note that the test +should NOT be against image_height, unless you never use scaling. The +image_height field is the height of the original unscaled image.) +The return value always equals the change in the value of output_scanline. + +If you don't use a suspending data source, it is safe to assume that +jpeg_read_scanlines() reads at least one scanline per call, until the +bottom of the image has been reached. + +If you use a buffer larger than one scanline, it is NOT safe to assume that +jpeg_read_scanlines() fills it. (The current implementation returns only a +few scanlines per call, no matter how large a buffer you pass.) So you must +always provide a loop that calls jpeg_read_scanlines() repeatedly until the +whole image has been read. + + +7. jpeg_finish_decompress(...); + +After all the image data has been read, call jpeg_finish_decompress() to +complete the decompression cycle. This causes working memory associated +with the JPEG object to be released. + +Typical code: + + jpeg_finish_decompress(&cinfo); + +If using the stdio source manager, don't forget to close the source stdio +stream if necessary. + +It is an error to call jpeg_finish_decompress() before reading the correct +total number of scanlines. If you wish to abort decompression, call +jpeg_abort() as discussed below. + +After completing a decompression cycle, you may dispose of the JPEG object as +discussed next, or you may use it to decompress another image. In that case +return to step 2 or 3 as appropriate. If you do not change the source +manager, the next image will be read from the same source. + + +8. Release the JPEG decompression object. + +When you are done with a JPEG decompression object, destroy it by calling +jpeg_destroy_decompress() or jpeg_destroy(). The previous discussion of +destroying compression objects applies here too. + +Typical code: + + jpeg_destroy_decompress(&cinfo); + + +9. Aborting. + +You can abort a decompression cycle by calling jpeg_destroy_decompress() or +jpeg_destroy() if you don't need the JPEG object any more, or +jpeg_abort_decompress() or jpeg_abort() if you want to reuse the object. +The previous discussion of aborting compression cycles applies here too. + + +Mechanics of usage: include files, linking, etc +----------------------------------------------- + +Applications using the JPEG library should include the header file jpeglib.h +to obtain declarations of data types and routines. Before including +jpeglib.h, include system headers that define at least the typedefs FILE and +size_t. On ANSI-conforming systems, including is sufficient; on +older Unix systems, you may need to define size_t. + +If the application needs to refer to individual JPEG library error codes, also +include jerror.h to define those symbols. + +jpeglib.h indirectly includes the files jconfig.h and jmorecfg.h. If you are +installing the JPEG header files in a system directory, you will want to +install all four files: jpeglib.h, jerror.h, jconfig.h, jmorecfg.h. + +The most convenient way to include the JPEG code into your executable program +is to prepare a library file ("libjpeg.a", or a corresponding name on non-Unix +machines) and reference it at your link step. If you use only half of the +library (only compression or only decompression), only that much code will be +included from the library, unless your linker is hopelessly brain-damaged. +The supplied makefiles build libjpeg.a automatically (see install.txt). + +While you can build the JPEG library as a shared library if the whim strikes +you, we don't really recommend it. The trouble with shared libraries is that +at some point you'll probably try to substitute a new version of the library +without recompiling the calling applications. That generally doesn't work +because the parameter struct declarations usually change with each new +version. In other words, the library's API is *not* guaranteed binary +compatible across versions; we only try to ensure source-code compatibility. +(In hindsight, it might have been smarter to hide the parameter structs from +applications and introduce a ton of access functions instead. Too late now, +however.) + +On some systems your application may need to set up a signal handler to ensure +that temporary files are deleted if the program is interrupted. This is most +critical if you are on MS-DOS and use the jmemdos.c memory manager back end; +it will try to grab extended memory for temp files, and that space will NOT be +freed automatically. See cjpeg.c or djpeg.c for an example signal handler. + +It may be worth pointing out that the core JPEG library does not actually +require the stdio library: only the default source/destination managers and +error handler need it. You can use the library in a stdio-less environment +if you replace those modules and use jmemnobs.c (or another memory manager of +your own devising). More info about the minimum system library requirements +may be found in jinclude.h. + + +ADVANCED FEATURES +================= + +Compression parameter selection +------------------------------- + +This section describes all the optional parameters you can set for JPEG +compression, as well as the "helper" routines provided to assist in this +task. Proper setting of some parameters requires detailed understanding +of the JPEG standard; if you don't know what a parameter is for, it's best +not to mess with it! See REFERENCES in the README file for pointers to +more info about JPEG. + +It's a good idea to call jpeg_set_defaults() first, even if you plan to set +all the parameters; that way your code is more likely to work with future JPEG +libraries that have additional parameters. For the same reason, we recommend +you use a helper routine where one is provided, in preference to twiddling +cinfo fields directly. + +The helper routines are: + +jpeg_set_defaults (j_compress_ptr cinfo) + This routine sets all JPEG parameters to reasonable defaults, using + only the input image's color space (field in_color_space, which must + already be set in cinfo). Many applications will only need to use + this routine and perhaps jpeg_set_quality(). + +jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace) + Sets the JPEG file's colorspace (field jpeg_color_space) as specified, + and sets other color-space-dependent parameters appropriately. See + "Special color spaces", below, before using this. A large number of + parameters, including all per-component parameters, are set by this + routine; if you want to twiddle individual parameters you should call + jpeg_set_colorspace() before rather than after. + +jpeg_default_colorspace (j_compress_ptr cinfo) + Selects an appropriate JPEG colorspace based on cinfo->in_color_space, + and calls jpeg_set_colorspace(). This is actually a subroutine of + jpeg_set_defaults(). It's broken out in case you want to change + just the colorspace-dependent JPEG parameters. + +jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline) + Constructs JPEG quantization tables appropriate for the indicated + quality setting. The quality value is expressed on the 0..100 scale + recommended by IJG (cjpeg's "-quality" switch uses this routine). + Note that the exact mapping from quality values to tables may change + in future IJG releases as more is learned about DCT quantization. + If the force_baseline parameter is TRUE, then the quantization table + entries are constrained to the range 1..255 for full JPEG baseline + compatibility. In the current implementation, this only makes a + difference for quality settings below 25, and it effectively prevents + very small/low quality files from being generated. The IJG decoder + is capable of reading the non-baseline files generated at low quality + settings when force_baseline is FALSE, but other decoders may not be. + +jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor, + boolean force_baseline) + Same as jpeg_set_quality() except that the generated tables are the + sample tables given in the JPEC spec section K.1, multiplied by the + specified scale factor (which is expressed as a percentage; thus + scale_factor = 100 reproduces the spec's tables). Note that larger + scale factors give lower quality. This entry point is useful for + conforming to the Adobe PostScript DCT conventions, but we do not + recommend linear scaling as a user-visible quality scale otherwise. + force_baseline again constrains the computed table entries to 1..255. + +int jpeg_quality_scaling (int quality) + Converts a value on the IJG-recommended quality scale to a linear + scaling percentage. Note that this routine may change or go away + in future releases --- IJG may choose to adopt a scaling method that + can't be expressed as a simple scalar multiplier, in which case the + premise of this routine collapses. Caveat user. + +jpeg_default_qtables (j_compress_ptr cinfo, boolean force_baseline) + Set default quantization tables with linear q_scale_factor[] values + (see below). + +jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, boolean force_baseline) + Allows an arbitrary quantization table to be created. which_tbl + indicates which table slot to fill. basic_table points to an array + of 64 unsigned ints given in normal array order. These values are + multiplied by scale_factor/100 and then clamped to the range 1..65535 + (or to 1..255 if force_baseline is TRUE). + CAUTION: prior to library version 6a, jpeg_add_quant_table expected + the basic table to be given in JPEG zigzag order. If you need to + write code that works with either older or newer versions of this + routine, you must check the library version number. Something like + "#if JPEG_LIB_VERSION >= 61" is the right test. + +jpeg_simple_progression (j_compress_ptr cinfo) + Generates a default scan script for writing a progressive-JPEG file. + This is the recommended method of creating a progressive file, + unless you want to make a custom scan sequence. You must ensure that + the JPEG color space is set correctly before calling this routine. + + +Compression parameters (cinfo fields) include: + +int block_size + Set DCT block size. All N from 1 to 16 are possible. + Default is 8 (baseline format). + Larger values produce higher compression, + smaller values produce higher quality. + An exact DCT stage is possible with 1 or 2. + With the default quality of 75 and default Luminance qtable + the DCT+Quantization stage is lossless for value 1. + Note that values other than 8 require a SmartScale capable decoder, + introduced with IJG JPEG 8. Setting the block_size parameter for + compression works with version 8c and later. + +J_DCT_METHOD dct_method + Selects the algorithm used for the DCT step. Choices are: + JDCT_ISLOW: slow but accurate integer algorithm + JDCT_IFAST: faster, less accurate integer method + JDCT_FLOAT: floating-point method + JDCT_DEFAULT: default method (normally JDCT_ISLOW) + JDCT_FASTEST: fastest method (normally JDCT_IFAST) + The FLOAT method is very slightly more accurate than the ISLOW method, + but may give different results on different machines due to varying + roundoff behavior. The integer methods should give the same results + on all machines. On machines with sufficiently fast FP hardware, the + floating-point method may also be the fastest. The IFAST method is + considerably less accurate than the other two; its use is not + recommended if high quality is a concern. JDCT_DEFAULT and + JDCT_FASTEST are macros configurable by each installation. + +unsigned int scale_num, scale_denom + Scale the image by the fraction scale_num/scale_denom. Default is + 1/1, or no scaling. Currently, the supported scaling ratios are + M/N with all N from 1 to 16, where M is the destination DCT size, + which is 8 by default (see block_size parameter above). + (The library design allows for arbitrary scaling ratios but this + is not likely to be implemented any time soon.) + +J_COLOR_SPACE jpeg_color_space +int num_components + The JPEG color space and corresponding number of components; see + "Special color spaces", below, for more info. We recommend using + jpeg_set_color_space() if you want to change these. + +boolean optimize_coding + TRUE causes the compressor to compute optimal Huffman coding tables + for the image. This requires an extra pass over the data and + therefore costs a good deal of space and time. The default is + FALSE, which tells the compressor to use the supplied or default + Huffman tables. In most cases optimal tables save only a few percent + of file size compared to the default tables. Note that when this is + TRUE, you need not supply Huffman tables at all, and any you do + supply will be overwritten. + +unsigned int restart_interval +int restart_in_rows + To emit restart markers in the JPEG file, set one of these nonzero. + Set restart_interval to specify the exact interval in MCU blocks. + Set restart_in_rows to specify the interval in MCU rows. (If + restart_in_rows is not 0, then restart_interval is set after the + image width in MCUs is computed.) Defaults are zero (no restarts). + One restart marker per MCU row is often a good choice. + NOTE: the overhead of restart markers is higher in grayscale JPEG + files than in color files, and MUCH higher in progressive JPEGs. + If you use restarts, you may want to use larger intervals in those + cases. + +const jpeg_scan_info * scan_info +int num_scans + By default, scan_info is NULL; this causes the compressor to write a + single-scan sequential JPEG file. If not NULL, scan_info points to + an array of scan definition records of length num_scans. The + compressor will then write a JPEG file having one scan for each scan + definition record. This is used to generate noninterleaved or + progressive JPEG files. The library checks that the scan array + defines a valid JPEG scan sequence. (jpeg_simple_progression creates + a suitable scan definition array for progressive JPEG.) This is + discussed further under "Progressive JPEG support". + +boolean do_fancy_downsampling + If TRUE, use direct DCT scaling with DCT size > 8 for downsampling + of chroma components. + If FALSE, use only DCT size <= 8 and simple separate downsampling. + Default is TRUE. + For better image stability in multiple generation compression cycles + it is preferable that this value matches the corresponding + do_fancy_upsampling value in decompression. + +int smoothing_factor + If non-zero, the input image is smoothed; the value should be 1 for + minimal smoothing to 100 for maximum smoothing. Consult jcsample.c + for details of the smoothing algorithm. The default is zero. + +boolean write_JFIF_header + If TRUE, a JFIF APP0 marker is emitted. jpeg_set_defaults() and + jpeg_set_colorspace() set this TRUE if a JFIF-legal JPEG color space + (ie, YCbCr or grayscale) is selected, otherwise FALSE. + +UINT8 JFIF_major_version +UINT8 JFIF_minor_version + The version number to be written into the JFIF marker. + jpeg_set_defaults() initializes the version to 1.01 (major=minor=1). + You should set it to 1.02 (major=1, minor=2) if you plan to write + any JFIF 1.02 extension markers. + +UINT8 density_unit +UINT16 X_density +UINT16 Y_density + The resolution information to be written into the JFIF marker; + not used otherwise. density_unit may be 0 for unknown, + 1 for dots/inch, or 2 for dots/cm. The default values are 0,1,1 + indicating square pixels of unknown size. + +boolean write_Adobe_marker + If TRUE, an Adobe APP14 marker is emitted. jpeg_set_defaults() and + jpeg_set_colorspace() set this TRUE if JPEG color space RGB, CMYK, + or YCCK is selected, otherwise FALSE. It is generally a bad idea + to set both write_JFIF_header and write_Adobe_marker. In fact, + you probably shouldn't change the default settings at all --- the + default behavior ensures that the JPEG file's color space can be + recognized by the decoder. + +JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS] + Pointers to coefficient quantization tables, one per table slot, + or NULL if no table is defined for a slot. Usually these should + be set via one of the above helper routines; jpeg_add_quant_table() + is general enough to define any quantization table. The other + routines will set up table slot 0 for luminance quality and table + slot 1 for chrominance. + +int q_scale_factor[NUM_QUANT_TBLS] + Linear quantization scaling factors (percentage, initialized 100) + for use with jpeg_default_qtables(). + See rdswitch.c and cjpeg.c for an example of usage. + Note that the q_scale_factor[] fields are the "linear" scales, so you + have to convert from user-defined ratings via jpeg_quality_scaling(). + Here is an example code which corresponds to cjpeg -quality 90,70: + + jpeg_set_defaults(cinfo); + + /* Set luminance quality 90. */ + cinfo->q_scale_factor[0] = jpeg_quality_scaling(90); + /* Set chrominance quality 70. */ + cinfo->q_scale_factor[1] = jpeg_quality_scaling(70); + + jpeg_default_qtables(cinfo, force_baseline); + + CAUTION: You must also set 1x1 subsampling for efficient separate + color quality selection, since the default value used by library + is 2x2: + + cinfo->comp_info[0].v_samp_factor = 1; + cinfo->comp_info[0].h_samp_factor = 1; + +JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS] +JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS] + Pointers to Huffman coding tables, one per table slot, or NULL if + no table is defined for a slot. Slots 0 and 1 are filled with the + JPEG sample tables by jpeg_set_defaults(). If you need to allocate + more table structures, jpeg_alloc_huff_table() may be used. + Note that optimal Huffman tables can be computed for an image + by setting optimize_coding, as discussed above; there's seldom + any need to mess with providing your own Huffman tables. + + +The actual dimensions of the JPEG image that will be written to the file are +given by the following fields. These are computed from the input image +dimensions and the compression parameters by jpeg_start_compress(). You can +also call jpeg_calc_jpeg_dimensions() to obtain the values that will result +from the current parameter settings. This can be useful if you are trying +to pick a scaling ratio that will get close to a desired target size. + +JDIMENSION jpeg_width Actual dimensions of output image. +JDIMENSION jpeg_height + + +Per-component parameters are stored in the struct cinfo.comp_info[i] for +component number i. Note that components here refer to components of the +JPEG color space, *not* the source image color space. A suitably large +comp_info[] array is allocated by jpeg_set_defaults(); if you choose not +to use that routine, it's up to you to allocate the array. + +int component_id + The one-byte identifier code to be recorded in the JPEG file for + this component. For the standard color spaces, we recommend you + leave the default values alone. + +int h_samp_factor +int v_samp_factor + Horizontal and vertical sampling factors for the component; must + be 1..4 according to the JPEG standard. Note that larger sampling + factors indicate a higher-resolution component; many people find + this behavior quite unintuitive. The default values are 2,2 for + luminance components and 1,1 for chrominance components, except + for grayscale where 1,1 is used. + +int quant_tbl_no + Quantization table number for component. The default value is + 0 for luminance components and 1 for chrominance components. + +int dc_tbl_no +int ac_tbl_no + DC and AC entropy coding table numbers. The default values are + 0 for luminance components and 1 for chrominance components. + +int component_index + Must equal the component's index in comp_info[]. (Beginning in + release v6, the compressor library will fill this in automatically; + you don't have to.) + + +Decompression parameter selection +--------------------------------- + +Decompression parameter selection is somewhat simpler than compression +parameter selection, since all of the JPEG internal parameters are +recorded in the source file and need not be supplied by the application. +(Unless you are working with abbreviated files, in which case see +"Abbreviated datastreams", below.) Decompression parameters control +the postprocessing done on the image to deliver it in a format suitable +for the application's use. Many of the parameters control speed/quality +tradeoffs, in which faster decompression may be obtained at the price of +a poorer-quality image. The defaults select the highest quality (slowest) +processing. + +The following fields in the JPEG object are set by jpeg_read_header() and +may be useful to the application in choosing decompression parameters: + +JDIMENSION image_width Width and height of image +JDIMENSION image_height +int num_components Number of color components +J_COLOR_SPACE jpeg_color_space Colorspace of image +boolean saw_JFIF_marker TRUE if a JFIF APP0 marker was seen + UINT8 JFIF_major_version Version information from JFIF marker + UINT8 JFIF_minor_version + UINT8 density_unit Resolution data from JFIF marker + UINT16 X_density + UINT16 Y_density +boolean saw_Adobe_marker TRUE if an Adobe APP14 marker was seen + UINT8 Adobe_transform Color transform code from Adobe marker + +The JPEG color space, unfortunately, is something of a guess since the JPEG +standard proper does not provide a way to record it. In practice most files +adhere to the JFIF or Adobe conventions, and the decoder will recognize these +correctly. See "Special color spaces", below, for more info. + + +The decompression parameters that determine the basic properties of the +returned image are: + +J_COLOR_SPACE out_color_space + Output color space. jpeg_read_header() sets an appropriate default + based on jpeg_color_space; typically it will be RGB or grayscale. + The application can change this field to request output in a different + colorspace. For example, set it to JCS_GRAYSCALE to get grayscale + output from a color file. (This is useful for previewing: grayscale + output is faster than full color since the color components need not + be processed.) Note that not all possible color space transforms are + currently implemented; you may need to extend jdcolor.c if you want an + unusual conversion. + +unsigned int scale_num, scale_denom + Scale the image by the fraction scale_num/scale_denom. Currently, + the supported scaling ratios are M/N with all M from 1 to 16, where + N is the source DCT size, which is 8 for baseline JPEG. (The library + design allows for arbitrary scaling ratios but this is not likely + to be implemented any time soon.) The values are initialized by + jpeg_read_header() with the source DCT size. For baseline JPEG + this is 8/8. If you change only the scale_num value while leaving + the other unchanged, then this specifies the DCT scaled size to be + applied on the given input. For baseline JPEG this is equivalent + to M/8 scaling, since the source DCT size for baseline JPEG is 8. + Smaller scaling ratios permit significantly faster decoding since + fewer pixels need be processed and a simpler IDCT method can be used. + +boolean quantize_colors + If set TRUE, colormapped output will be delivered. Default is FALSE, + meaning that full-color output will be delivered. + +The next three parameters are relevant only if quantize_colors is TRUE. + +int desired_number_of_colors + Maximum number of colors to use in generating a library-supplied color + map (the actual number of colors is returned in a different field). + Default 256. Ignored when the application supplies its own color map. + +boolean two_pass_quantize + If TRUE, an extra pass over the image is made to select a custom color + map for the image. This usually looks a lot better than the one-size- + fits-all colormap that is used otherwise. Default is TRUE. Ignored + when the application supplies its own color map. + +J_DITHER_MODE dither_mode + Selects color dithering method. Supported values are: + JDITHER_NONE no dithering: fast, very low quality + JDITHER_ORDERED ordered dither: moderate speed and quality + JDITHER_FS Floyd-Steinberg dither: slow, high quality + Default is JDITHER_FS. (At present, ordered dither is implemented + only in the single-pass, standard-colormap case. If you ask for + ordered dither when two_pass_quantize is TRUE or when you supply + an external color map, you'll get F-S dithering.) + +When quantize_colors is TRUE, the target color map is described by the next +two fields. colormap is set to NULL by jpeg_read_header(). The application +can supply a color map by setting colormap non-NULL and setting +actual_number_of_colors to the map size. Otherwise, jpeg_start_decompress() +selects a suitable color map and sets these two fields itself. +[Implementation restriction: at present, an externally supplied colormap is +only accepted for 3-component output color spaces.] + +JSAMPARRAY colormap + The color map, represented as a 2-D pixel array of out_color_components + rows and actual_number_of_colors columns. Ignored if not quantizing. + CAUTION: if the JPEG library creates its own colormap, the storage + pointed to by this field is released by jpeg_finish_decompress(). + Copy the colormap somewhere else first, if you want to save it. + +int actual_number_of_colors + The number of colors in the color map. + +Additional decompression parameters that the application may set include: + +J_DCT_METHOD dct_method + Selects the algorithm used for the DCT step. Choices are the same + as described above for compression. + +boolean do_fancy_upsampling + If TRUE, use direct DCT scaling with DCT size > 8 for upsampling + of chroma components. + If FALSE, use only DCT size <= 8 and simple separate upsampling. + Default is TRUE. + For better image stability in multiple generation compression cycles + it is preferable that this value matches the corresponding + do_fancy_downsampling value in compression. + +boolean do_block_smoothing + If TRUE, interblock smoothing is applied in early stages of decoding + progressive JPEG files; if FALSE, not. Default is TRUE. Early + progression stages look "fuzzy" with smoothing, "blocky" without. + In any case, block smoothing ceases to be applied after the first few + AC coefficients are known to full accuracy, so it is relevant only + when using buffered-image mode for progressive images. + +boolean enable_1pass_quant +boolean enable_external_quant +boolean enable_2pass_quant + These are significant only in buffered-image mode, which is + described in its own section below. + + +The output image dimensions are given by the following fields. These are +computed from the source image dimensions and the decompression parameters +by jpeg_start_decompress(). You can also call jpeg_calc_output_dimensions() +to obtain the values that will result from the current parameter settings. +This can be useful if you are trying to pick a scaling ratio that will get +close to a desired target size. It's also important if you are using the +JPEG library's memory manager to allocate output buffer space, because you +are supposed to request such buffers *before* jpeg_start_decompress(). + +JDIMENSION output_width Actual dimensions of output image. +JDIMENSION output_height +int out_color_components Number of color components in out_color_space. +int output_components Number of color components returned. +int rec_outbuf_height Recommended height of scanline buffer. + +When quantizing colors, output_components is 1, indicating a single color map +index per pixel. Otherwise it equals out_color_components. The output arrays +are required to be output_width * output_components JSAMPLEs wide. + +rec_outbuf_height is the recommended minimum height (in scanlines) of the +buffer passed to jpeg_read_scanlines(). If the buffer is smaller, the +library will still work, but time will be wasted due to unnecessary data +copying. In high-quality modes, rec_outbuf_height is always 1, but some +faster, lower-quality modes set it to larger values (typically 2 to 4). +If you are going to ask for a high-speed processing mode, you may as well +go to the trouble of honoring rec_outbuf_height so as to avoid data copying. +(An output buffer larger than rec_outbuf_height lines is OK, but won't +provide any material speed improvement over that height.) + + +Special color spaces +-------------------- + +The JPEG standard itself is "color blind" and doesn't specify any particular +color space. It is customary to convert color data to a luminance/chrominance +color space before compressing, since this permits greater compression. The +existing de-facto JPEG file format standards specify YCbCr or grayscale data +(JFIF), or grayscale, RGB, YCbCr, CMYK, or YCCK (Adobe). For special +applications such as multispectral images, other color spaces can be used, +but it must be understood that such files will be unportable. + +The JPEG library can handle the most common colorspace conversions (namely +RGB <=> YCbCr and CMYK <=> YCCK). It can also deal with data of an unknown +color space, passing it through without conversion. If you deal extensively +with an unusual color space, you can easily extend the library to understand +additional color spaces and perform appropriate conversions. + +For compression, the source data's color space is specified by field +in_color_space. This is transformed to the JPEG file's color space given +by jpeg_color_space. jpeg_set_defaults() chooses a reasonable JPEG color +space depending on in_color_space, but you can override this by calling +jpeg_set_colorspace(). Of course you must select a supported transformation. +jccolor.c currently supports the following transformations: + RGB => YCbCr + RGB => GRAYSCALE + YCbCr => GRAYSCALE + CMYK => YCCK +plus the null transforms: GRAYSCALE => GRAYSCALE, RGB => RGB, +YCbCr => YCbCr, CMYK => CMYK, YCCK => YCCK, and UNKNOWN => UNKNOWN. + +The de-facto file format standards (JFIF and Adobe) specify APPn markers that +indicate the color space of the JPEG file. It is important to ensure that +these are written correctly, or omitted if the JPEG file's color space is not +one of the ones supported by the de-facto standards. jpeg_set_colorspace() +will set the compression parameters to include or omit the APPn markers +properly, so long as it is told the truth about the JPEG color space. +For example, if you are writing some random 3-component color space without +conversion, don't try to fake out the library by setting in_color_space and +jpeg_color_space to JCS_YCbCr; use JCS_UNKNOWN. You may want to write an +APPn marker of your own devising to identify the colorspace --- see "Special +markers", below. + +When told that the color space is UNKNOWN, the library will default to using +luminance-quality compression parameters for all color components. You may +well want to change these parameters. See the source code for +jpeg_set_colorspace(), in jcparam.c, for details. + +For decompression, the JPEG file's color space is given in jpeg_color_space, +and this is transformed to the output color space out_color_space. +jpeg_read_header's setting of jpeg_color_space can be relied on if the file +conforms to JFIF or Adobe conventions, but otherwise it is no better than a +guess. If you know the JPEG file's color space for certain, you can override +jpeg_read_header's guess by setting jpeg_color_space. jpeg_read_header also +selects a default output color space based on (its guess of) jpeg_color_space; +set out_color_space to override this. Again, you must select a supported +transformation. jdcolor.c currently supports + YCbCr => GRAYSCALE + YCbCr => RGB + GRAYSCALE => RGB + YCCK => CMYK +as well as the null transforms. (Since GRAYSCALE=>RGB is provided, an +application can force grayscale JPEGs to look like color JPEGs if it only +wants to handle one case.) + +The two-pass color quantizer, jquant2.c, is specialized to handle RGB data +(it weights distances appropriately for RGB colors). You'll need to modify +the code if you want to use it for non-RGB output color spaces. Note that +jquant2.c is used to map to an application-supplied colormap as well as for +the normal two-pass colormap selection process. + +CAUTION: it appears that Adobe Photoshop writes inverted data in CMYK JPEG +files: 0 represents 100% ink coverage, rather than 0% ink as you'd expect. +This is arguably a bug in Photoshop, but if you need to work with Photoshop +CMYK files, you will have to deal with it in your application. We cannot +"fix" this in the library by inverting the data during the CMYK<=>YCCK +transform, because that would break other applications, notably Ghostscript. +Photoshop versions prior to 3.0 write EPS files containing JPEG-encoded CMYK +data in the same inverted-YCCK representation used in bare JPEG files, but +the surrounding PostScript code performs an inversion using the PS image +operator. I am told that Photoshop 3.0 will write uninverted YCCK in +EPS/JPEG files, and will omit the PS-level inversion. (But the data +polarity used in bare JPEG files will not change in 3.0.) In either case, +the JPEG library must not invert the data itself, or else Ghostscript would +read these EPS files incorrectly. + + +Error handling +-------------- + +When the default error handler is used, any error detected inside the JPEG +routines will cause a message to be printed on stderr, followed by exit(). +You can supply your own error handling routines to override this behavior +and to control the treatment of nonfatal warnings and trace/debug messages. +The file example.c illustrates the most common case, which is to have the +application regain control after an error rather than exiting. + +The JPEG library never writes any message directly; it always goes through +the error handling routines. Three classes of messages are recognized: + * Fatal errors: the library cannot continue. + * Warnings: the library can continue, but the data is corrupt, and a + damaged output image is likely to result. + * Trace/informational messages. These come with a trace level indicating + the importance of the message; you can control the verbosity of the + program by adjusting the maximum trace level that will be displayed. + +You may, if you wish, simply replace the entire JPEG error handling module +(jerror.c) with your own code. However, you can avoid code duplication by +only replacing some of the routines depending on the behavior you need. +This is accomplished by calling jpeg_std_error() as usual, but then overriding +some of the method pointers in the jpeg_error_mgr struct, as illustrated by +example.c. + +All of the error handling routines will receive a pointer to the JPEG object +(a j_common_ptr which points to either a jpeg_compress_struct or a +jpeg_decompress_struct; if you need to tell which, test the is_decompressor +field). This struct includes a pointer to the error manager struct in its +"err" field. Frequently, custom error handler routines will need to access +additional data which is not known to the JPEG library or the standard error +handler. The most convenient way to do this is to embed either the JPEG +object or the jpeg_error_mgr struct in a larger structure that contains +additional fields; then casting the passed pointer provides access to the +additional fields. Again, see example.c for one way to do it. (Beginning +with IJG version 6b, there is also a void pointer "client_data" in each +JPEG object, which the application can also use to find related data. +The library does not touch client_data at all.) + +The individual methods that you might wish to override are: + +error_exit (j_common_ptr cinfo) + Receives control for a fatal error. Information sufficient to + generate the error message has been stored in cinfo->err; call + output_message to display it. Control must NOT return to the caller; + generally this routine will exit() or longjmp() somewhere. + Typically you would override this routine to get rid of the exit() + default behavior. Note that if you continue processing, you should + clean up the JPEG object with jpeg_abort() or jpeg_destroy(). + +output_message (j_common_ptr cinfo) + Actual output of any JPEG message. Override this to send messages + somewhere other than stderr. Note that this method does not know + how to generate a message, only where to send it. + +format_message (j_common_ptr cinfo, char * buffer) + Constructs a readable error message string based on the error info + stored in cinfo->err. This method is called by output_message. Few + applications should need to override this method. One possible + reason for doing so is to implement dynamic switching of error message + language. + +emit_message (j_common_ptr cinfo, int msg_level) + Decide whether or not to emit a warning or trace message; if so, + calls output_message. The main reason for overriding this method + would be to abort on warnings. msg_level is -1 for warnings, + 0 and up for trace messages. + +Only error_exit() and emit_message() are called from the rest of the JPEG +library; the other two are internal to the error handler. + +The actual message texts are stored in an array of strings which is pointed to +by the field err->jpeg_message_table. The messages are numbered from 0 to +err->last_jpeg_message, and it is these code numbers that are used in the +JPEG library code. You could replace the message texts (for instance, with +messages in French or German) by changing the message table pointer. See +jerror.h for the default texts. CAUTION: this table will almost certainly +change or grow from one library version to the next. + +It may be useful for an application to add its own message texts that are +handled by the same mechanism. The error handler supports a second "add-on" +message table for this purpose. To define an addon table, set the pointer +err->addon_message_table and the message numbers err->first_addon_message and +err->last_addon_message. If you number the addon messages beginning at 1000 +or so, you won't have to worry about conflicts with the library's built-in +messages. See the sample applications cjpeg/djpeg for an example of using +addon messages (the addon messages are defined in cderror.h). + +Actual invocation of the error handler is done via macros defined in jerror.h: + ERREXITn(...) for fatal errors + WARNMSn(...) for corrupt-data warnings + TRACEMSn(...) for trace and informational messages. +These macros store the message code and any additional parameters into the +error handler struct, then invoke the error_exit() or emit_message() method. +The variants of each macro are for varying numbers of additional parameters. +The additional parameters are inserted into the generated message using +standard printf() format codes. + +See jerror.h and jerror.c for further details. + + +Compressed data handling (source and destination managers) +---------------------------------------------------------- + +The JPEG compression library sends its compressed data to a "destination +manager" module. The default destination manager just writes the data to a +memory buffer or to a stdio stream, but you can provide your own manager to +do something else. Similarly, the decompression library calls a "source +manager" to obtain the compressed data; you can provide your own source +manager if you want the data to come from somewhere other than a memory +buffer or a stdio stream. + +In both cases, compressed data is processed a bufferload at a time: the +destination or source manager provides a work buffer, and the library invokes +the manager only when the buffer is filled or emptied. (You could define a +one-character buffer to force the manager to be invoked for each byte, but +that would be rather inefficient.) The buffer's size and location are +controlled by the manager, not by the library. For example, the memory +source manager just makes the buffer pointer and length point to the original +data in memory. In this case the buffer-reload procedure will be invoked +only if the decompressor ran off the end of the datastream, which would +indicate an erroneous datastream. + +The work buffer is defined as an array of datatype JOCTET, which is generally +"char" or "unsigned char". On a machine where char is not exactly 8 bits +wide, you must define JOCTET as a wider data type and then modify the data +source and destination modules to transcribe the work arrays into 8-bit units +on external storage. + +A data destination manager struct contains a pointer and count defining the +next byte to write in the work buffer and the remaining free space: + + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + +The library increments the pointer and decrements the count until the buffer +is filled. The manager's empty_output_buffer method must reset the pointer +and count. The manager is expected to remember the buffer's starting address +and total size in private fields not visible to the library. + +A data destination manager provides three methods: + +init_destination (j_compress_ptr cinfo) + Initialize destination. This is called by jpeg_start_compress() + before any data is actually written. It must initialize + next_output_byte and free_in_buffer. free_in_buffer must be + initialized to a positive value. + +empty_output_buffer (j_compress_ptr cinfo) + This is called whenever the buffer has filled (free_in_buffer + reaches zero). In typical applications, it should write out the + *entire* buffer (use the saved start address and buffer length; + ignore the current state of next_output_byte and free_in_buffer). + Then reset the pointer & count to the start of the buffer, and + return TRUE indicating that the buffer has been dumped. + free_in_buffer must be set to a positive value when TRUE is + returned. A FALSE return should only be used when I/O suspension is + desired (this operating mode is discussed in the next section). + +term_destination (j_compress_ptr cinfo) + Terminate destination --- called by jpeg_finish_compress() after all + data has been written. In most applications, this must flush any + data remaining in the buffer. Use either next_output_byte or + free_in_buffer to determine how much data is in the buffer. + +term_destination() is NOT called by jpeg_abort() or jpeg_destroy(). If you +want the destination manager to be cleaned up during an abort, you must do it +yourself. + +You will also need code to create a jpeg_destination_mgr struct, fill in its +method pointers, and insert a pointer to the struct into the "dest" field of +the JPEG compression object. This can be done in-line in your setup code if +you like, but it's probably cleaner to provide a separate routine similar to +the jpeg_stdio_dest() or jpeg_mem_dest() routines of the supplied destination +managers. + +Decompression source managers follow a parallel design, but with some +additional frammishes. The source manager struct contains a pointer and count +defining the next byte to read from the work buffer and the number of bytes +remaining: + + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + +The library increments the pointer and decrements the count until the buffer +is emptied. The manager's fill_input_buffer method must reset the pointer and +count. In most applications, the manager must remember the buffer's starting +address and total size in private fields not visible to the library. + +A data source manager provides five methods: + +init_source (j_decompress_ptr cinfo) + Initialize source. This is called by jpeg_read_header() before any + data is actually read. Unlike init_destination(), it may leave + bytes_in_buffer set to 0 (in which case a fill_input_buffer() call + will occur immediately). + +fill_input_buffer (j_decompress_ptr cinfo) + This is called whenever bytes_in_buffer has reached zero and more + data is wanted. In typical applications, it should read fresh data + into the buffer (ignoring the current state of next_input_byte and + 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. bytes_in_buffer MUST be set to a positive value + if TRUE is returned. A FALSE return should only be used when I/O + suspension is desired (this mode is discussed in the next section). + +skip_input_data (j_decompress_ptr cinfo, long num_bytes) + Skip num_bytes worth of data. The buffer pointer and count should + be advanced over num_bytes input bytes, refilling the buffer as + needed. This is used to skip over a potentially large amount of + uninteresting data (such as an APPn marker). In some applications + it may be possible to optimize away the reading of the skipped data, + but it's not clear that being smart is worth much trouble; large + skips are uncommon. bytes_in_buffer may be zero on return. + A zero or negative skip count should be treated as a no-op. + +resync_to_restart (j_decompress_ptr cinfo, int desired) + This routine is called only when the decompressor has failed to find + a restart (RSTn) marker where one is expected. Its mission is to + find a suitable point for resuming decompression. For most + applications, we recommend that you just use the default resync + procedure, jpeg_resync_to_restart(). However, if you are able to back + up in the input data stream, or if you have a-priori knowledge about + the likely location of restart markers, you may be able to do better. + Read the read_restart_marker() and jpeg_resync_to_restart() routines + in jdmarker.c if you think you'd like to implement your own resync + procedure. + +term_source (j_decompress_ptr cinfo) + Terminate source --- called by jpeg_finish_decompress() after all + data has been read. Often a no-op. + +For both fill_input_buffer() and skip_input_data(), there is no such thing +as an EOF return. If the end of the file has been reached, the routine has +a choice of exiting via 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. In pathological cases, the decompressor +may swallow the EOI and again demand data ... just keep feeding it fake EOIs. +jdatasrc.c illustrates the recommended error recovery behavior. + +term_source() is NOT called by jpeg_abort() or jpeg_destroy(). If you want +the source manager to be cleaned up during an abort, you must do it yourself. + +You will also need code to create a jpeg_source_mgr struct, fill in its method +pointers, and insert a pointer to the struct into the "src" field of the JPEG +decompression object. This can be done in-line in your setup code if you +like, but it's probably cleaner to provide a separate routine similar to the +jpeg_stdio_src() or jpeg_mem_src() routines of the supplied source managers. + +For more information, consult the memory and stdio source and destination +managers in jdatasrc.c and jdatadst.c. + + +I/O suspension +-------------- + +Some applications need to use the JPEG library as an incremental memory-to- +memory filter: when the compressed data buffer is filled or emptied, they want +control to return to the outer loop, rather than expecting that the buffer can +be emptied or reloaded within the data source/destination manager subroutine. +The library supports this need by providing an "I/O suspension" mode, which we +describe in this section. + +The I/O suspension mode is not a panacea: nothing is guaranteed about the +maximum amount of time spent in any one call to the library, so it will not +eliminate response-time problems in single-threaded applications. If you +need guaranteed response time, we suggest you "bite the bullet" and implement +a real multi-tasking capability. + +To use I/O suspension, cooperation is needed between the calling application +and the data source or destination manager; you will always need a custom +source/destination manager. (Please read the previous section if you haven't +already.) The basic idea is that the empty_output_buffer() or +fill_input_buffer() routine is a no-op, merely returning FALSE to indicate +that it has done nothing. Upon seeing this, the JPEG library suspends +operation and returns to its caller. The surrounding application is +responsible for emptying or refilling the work buffer before calling the +JPEG library again. + +Compression suspension: + +For compression suspension, use an empty_output_buffer() routine that returns +FALSE; typically it will not do anything else. This will cause the +compressor to return to the caller of jpeg_write_scanlines(), with the return +value indicating that not all the supplied scanlines have been accepted. +The application must make more room in the output buffer, adjust the output +buffer pointer/count appropriately, and then call jpeg_write_scanlines() +again, pointing to the first unconsumed scanline. + +When forced to suspend, the compressor will backtrack to a convenient stopping +point (usually the start of the current MCU); it will regenerate some output +data when restarted. Therefore, although empty_output_buffer() is only +called when the buffer is filled, you should NOT write out the entire buffer +after a suspension. Write only the data up to the current position of +next_output_byte/free_in_buffer. The data beyond that point will be +regenerated after resumption. + +Because of the backtracking behavior, a good-size output buffer is essential +for efficiency; you don't want the compressor to suspend often. (In fact, an +overly small buffer could lead to infinite looping, if a single MCU required +more data than would fit in the buffer.) We recommend a buffer of at least +several Kbytes. You may want to insert explicit code to ensure that you don't +call jpeg_write_scanlines() unless there is a reasonable amount of space in +the output buffer; in other words, flush the buffer before trying to compress +more data. + +The compressor does not allow suspension while it is trying to write JPEG +markers at the beginning and end of the file. This means that: + * At the beginning of a compression operation, there must be enough free + space in the output buffer to hold the header markers (typically 600 or + so bytes). The recommended buffer size is bigger than this anyway, so + this is not a problem as long as you start with an empty buffer. However, + this restriction might catch you if you insert large special markers, such + as a JFIF thumbnail image, without flushing the buffer afterwards. + * When you call jpeg_finish_compress(), there must be enough space in the + output buffer to emit any buffered data and the final EOI marker. In the + current implementation, half a dozen bytes should suffice for this, but + for safety's sake we recommend ensuring that at least 100 bytes are free + before calling jpeg_finish_compress(). + +A more significant restriction is that jpeg_finish_compress() cannot suspend. +This means you cannot use suspension with multi-pass operating modes, namely +Huffman code optimization and multiple-scan output. Those modes write the +whole file during jpeg_finish_compress(), which will certainly result in +buffer overrun. (Note that this restriction applies only to compression, +not decompression. The decompressor supports input suspension in all of its +operating modes.) + +Decompression suspension: + +For decompression suspension, use a fill_input_buffer() routine that simply +returns FALSE (except perhaps during error recovery, as discussed below). +This will cause the decompressor to return to its caller with an indication +that suspension has occurred. This can happen at four places: + * jpeg_read_header(): will return JPEG_SUSPENDED. + * jpeg_start_decompress(): will return FALSE, rather than its usual TRUE. + * jpeg_read_scanlines(): will return the number of scanlines already + completed (possibly 0). + * jpeg_finish_decompress(): will return FALSE, rather than its usual TRUE. +The surrounding application must recognize these cases, load more data into +the input buffer, and repeat the call. In the case of jpeg_read_scanlines(), +increment the passed pointers past any scanlines successfully read. + +Just as with compression, the decompressor will typically backtrack to a +convenient restart point before suspending. When fill_input_buffer() is +called, next_input_byte/bytes_in_buffer point to the current restart point, +which is where the decompressor will backtrack to if FALSE is returned. +The data beyond that position must NOT be discarded if you suspend; it needs +to be re-read upon resumption. In most implementations, you'll need to shift +this data down to the start of your work buffer and then load more data after +it. Again, this behavior means that a several-Kbyte work buffer is essential +for decent performance; furthermore, you should load a reasonable amount of +new data before resuming decompression. (If you loaded, say, only one new +byte each time around, you could waste a LOT of cycles.) + +The skip_input_data() source manager routine requires special care in a +suspension scenario. This routine is NOT granted the ability to suspend the +decompressor; it can decrement bytes_in_buffer to zero, but no more. If the +requested skip distance exceeds the amount of data currently in the input +buffer, then skip_input_data() must set bytes_in_buffer to zero and record the +additional skip distance somewhere else. The decompressor will immediately +call fill_input_buffer(), which should return FALSE, which will cause a +suspension return. The surrounding application must then arrange to discard +the recorded number of bytes before it resumes loading the input buffer. +(Yes, this design is rather baroque, but it avoids complexity in the far more +common case where a non-suspending source manager is used.) + +If the input data has been exhausted, we recommend that you emit a warning +and insert dummy EOI markers just as a non-suspending data source manager +would do. This can be handled either in the surrounding application logic or +within fill_input_buffer(); the latter is probably more efficient. If +fill_input_buffer() knows that no more data is available, it can set the +pointer/count to point to a dummy EOI marker and then return TRUE just as +though it had read more data in a non-suspending situation. + +The decompressor does not attempt to suspend within standard JPEG markers; +instead it will backtrack to the start of the marker and reprocess the whole +marker next time. Hence the input buffer must be large enough to hold the +longest standard marker in the file. Standard JPEG markers should normally +not exceed a few hundred bytes each (DHT tables are typically the longest). +We recommend at least a 2K buffer for performance reasons, which is much +larger than any correct marker is likely to be. For robustness against +damaged marker length counts, you may wish to insert a test in your +application for the case that the input buffer is completely full and yet +the decoder has suspended without consuming any data --- otherwise, if this +situation did occur, it would lead to an endless loop. (The library can't +provide this test since it has no idea whether "the buffer is full", or +even whether there is a fixed-size input buffer.) + +The input buffer would need to be 64K to allow for arbitrary COM or APPn +markers, but these are handled specially: they are either saved into allocated +memory, or skipped over by calling skip_input_data(). In the former case, +suspension is handled correctly, and in the latter case, the problem of +buffer overrun is placed on skip_input_data's shoulders, as explained above. +Note that if you provide your own marker handling routine for large markers, +you should consider how to deal with buffer overflow. + +Multiple-buffer management: + +In some applications it is desirable to store the compressed data in a linked +list of buffer areas, so as to avoid data copying. This can be handled by +having empty_output_buffer() or fill_input_buffer() set the pointer and count +to reference the next available buffer; FALSE is returned only if no more +buffers are available. Although seemingly straightforward, there is a +pitfall in this approach: the backtrack that occurs when FALSE is returned +could back up into an earlier buffer. For example, when fill_input_buffer() +is called, the current pointer & count indicate the backtrack restart point. +Since fill_input_buffer() will set the pointer and count to refer to a new +buffer, the restart position must be saved somewhere else. Suppose a second +call to fill_input_buffer() occurs in the same library call, and no +additional input data is available, so fill_input_buffer must return FALSE. +If the JPEG library has not moved the pointer/count forward in the current +buffer, then *the correct restart point is the saved position in the prior +buffer*. Prior buffers may be discarded only after the library establishes +a restart point within a later buffer. Similar remarks apply for output into +a chain of buffers. + +The library will never attempt to backtrack over a skip_input_data() call, +so any skipped data can be permanently discarded. You still have to deal +with the case of skipping not-yet-received data, however. + +It's much simpler to use only a single buffer; when fill_input_buffer() is +called, move any unconsumed data (beyond the current pointer/count) down to +the beginning of this buffer and then load new data into the remaining buffer +space. This approach requires a little more data copying but is far easier +to get right. + + +Progressive JPEG support +------------------------ + +Progressive JPEG rearranges the stored data into a series of scans of +increasing quality. In situations where a JPEG file is transmitted across a +slow communications link, a decoder can generate a low-quality image very +quickly from the first scan, then gradually improve the displayed quality as +more scans are received. The final image after all scans are complete is +identical to that of a regular (sequential) JPEG file of the same quality +setting. Progressive JPEG files are often slightly smaller than equivalent +sequential JPEG files, but the possibility of incremental display is the main +reason for using progressive JPEG. + +The IJG encoder library generates progressive JPEG files when given a +suitable "scan script" defining how to divide the data into scans. +Creation of progressive JPEG files is otherwise transparent to the encoder. +Progressive JPEG files can also be read transparently by the decoder library. +If the decoding application simply uses the library as defined above, it +will receive a final decoded image without any indication that the file was +progressive. Of course, this approach does not allow incremental display. +To perform incremental display, an application needs to use the decoder +library's "buffered-image" mode, in which it receives a decoded image +multiple times. + +Each displayed scan requires about as much work to decode as a full JPEG +image of the same size, so the decoder must be fairly fast in relation to the +data transmission rate in order to make incremental display useful. However, +it is possible to skip displaying the image and simply add the incoming bits +to the decoder's coefficient buffer. This is fast because only Huffman +decoding need be done, not IDCT, upsampling, colorspace conversion, etc. +The IJG decoder library allows the application to switch dynamically between +displaying the image and simply absorbing the incoming bits. A properly +coded application can automatically adapt the number of display passes to +suit the time available as the image is received. Also, a final +higher-quality display cycle can be performed from the buffered data after +the end of the file is reached. + +Progressive compression: + +To create a progressive JPEG file (or a multiple-scan sequential JPEG file), +set the scan_info cinfo field to point to an array of scan descriptors, and +perform compression as usual. Instead of constructing your own scan list, +you can call the jpeg_simple_progression() helper routine to create a +recommended progression sequence; this method should be used by all +applications that don't want to get involved in the nitty-gritty of +progressive scan sequence design. (If you want to provide user control of +scan sequences, you may wish to borrow the scan script reading code found +in rdswitch.c, so that you can read scan script files just like cjpeg's.) +When scan_info is not NULL, the compression library will store DCT'd data +into a buffer array as jpeg_write_scanlines() is called, and will emit all +the requested scans during jpeg_finish_compress(). This implies that +multiple-scan output cannot be created with a suspending data destination +manager, since jpeg_finish_compress() does not support suspension. We +should also note that the compressor currently forces Huffman optimization +mode when creating a progressive JPEG file, because the default Huffman +tables are unsuitable for progressive files. + +Progressive decompression: + +When buffered-image mode is not used, the decoder library will read all of +a multi-scan file during jpeg_start_decompress(), so that it can provide a +final decoded image. (Here "multi-scan" means either progressive or +multi-scan sequential.) This makes multi-scan files transparent to the +decoding application. However, existing applications that used suspending +input with version 5 of the IJG library will need to be modified to check +for a suspension return from jpeg_start_decompress(). + +To perform incremental display, an application must use the library's +buffered-image mode. This is described in the next section. + + +Buffered-image mode +------------------- + +In buffered-image mode, the library stores the partially decoded image in a +coefficient buffer, from which it can be read out as many times as desired. +This mode is typically used for incremental display of progressive JPEG files, +but it can be used with any JPEG file. Each scan of a progressive JPEG file +adds more data (more detail) to the buffered image. The application can +display in lockstep with the source file (one display pass per input scan), +or it can allow input processing to outrun display processing. By making +input and display processing run independently, it is possible for the +application to adapt progressive display to a wide range of data transmission +rates. + +The basic control flow for buffered-image decoding is + + jpeg_create_decompress() + set data source + jpeg_read_header() + set overall decompression parameters + cinfo.buffered_image = TRUE; /* select buffered-image mode */ + jpeg_start_decompress() + for (each output pass) { + adjust output decompression parameters if required + jpeg_start_output() /* start a new output pass */ + for (all scanlines in image) { + jpeg_read_scanlines() + display scanlines + } + jpeg_finish_output() /* terminate output pass */ + } + jpeg_finish_decompress() + jpeg_destroy_decompress() + +This differs from ordinary unbuffered decoding in that there is an additional +level of looping. The application can choose how many output passes to make +and how to display each pass. + +The simplest approach to displaying progressive images is to do one display +pass for each scan appearing in the input file. In this case the outer loop +condition is typically + while (! jpeg_input_complete(&cinfo)) +and the start-output call should read + jpeg_start_output(&cinfo, cinfo.input_scan_number); +The second parameter to jpeg_start_output() indicates which scan of the input +file is to be displayed; the scans are numbered starting at 1 for this +purpose. (You can use a loop counter starting at 1 if you like, but using +the library's input scan counter is easier.) The library automatically reads +data as necessary to complete each requested scan, and jpeg_finish_output() +advances to the next scan or end-of-image marker (hence input_scan_number +will be incremented by the time control arrives back at jpeg_start_output()). +With this technique, data is read from the input file only as needed, and +input and output processing run in lockstep. + +After reading the final scan and reaching the end of the input file, the +buffered image remains available; it can be read additional times by +repeating the jpeg_start_output()/jpeg_read_scanlines()/jpeg_finish_output() +sequence. For example, a useful technique is to use fast one-pass color +quantization for display passes made while the image is arriving, followed by +a final display pass using two-pass quantization for highest quality. This +is done by changing the library parameters before the final output pass. +Changing parameters between passes is discussed in detail below. + +In general the last scan of a progressive file cannot be recognized as such +until after it is read, so a post-input display pass is the best approach if +you want special processing in the final pass. + +When done with the image, be sure to call jpeg_finish_decompress() to release +the buffered image (or just use jpeg_destroy_decompress()). + +If input data arrives faster than it can be displayed, the application can +cause the library to decode input data in advance of what's needed to produce +output. This is done by calling the routine jpeg_consume_input(). +The return value is one of the following: + JPEG_REACHED_SOS: reached an SOS marker (the start of a new scan) + JPEG_REACHED_EOI: reached the EOI marker (end of image) + JPEG_ROW_COMPLETED: completed reading one MCU row of compressed data + JPEG_SCAN_COMPLETED: completed reading last MCU row of current scan + JPEG_SUSPENDED: suspended before completing any of the above +(JPEG_SUSPENDED can occur only if a suspending data source is used.) This +routine can be called at any time after initializing the JPEG object. It +reads some additional data and returns when one of the indicated significant +events occurs. (If called after the EOI marker is reached, it will +immediately return JPEG_REACHED_EOI without attempting to read more data.) + +The library's output processing will automatically call jpeg_consume_input() +whenever the output processing overtakes the input; thus, simple lockstep +display requires no direct calls to jpeg_consume_input(). But by adding +calls to jpeg_consume_input(), you can absorb data in advance of what is +being displayed. This has two benefits: + * You can limit buildup of unprocessed data in your input buffer. + * You can eliminate extra display passes by paying attention to the + state of the library's input processing. + +The first of these benefits only requires interspersing calls to +jpeg_consume_input() with your display operations and any other processing +you may be doing. To avoid wasting cycles due to backtracking, it's best to +call jpeg_consume_input() only after a hundred or so new bytes have arrived. +This is discussed further under "I/O suspension", above. (Note: the JPEG +library currently is not thread-safe. You must not call jpeg_consume_input() +from one thread of control if a different library routine is working on the +same JPEG object in another thread.) + +When input arrives fast enough that more than one new scan is available +before you start a new output pass, you may as well skip the output pass +corresponding to the completed scan. This occurs for free if you pass +cinfo.input_scan_number as the target scan number to jpeg_start_output(). +The input_scan_number field is simply the index of the scan currently being +consumed by the input processor. You can ensure that this is up-to-date by +emptying the input buffer just before calling jpeg_start_output(): call +jpeg_consume_input() repeatedly until it returns JPEG_SUSPENDED or +JPEG_REACHED_EOI. + +The target scan number passed to jpeg_start_output() is saved in the +cinfo.output_scan_number field. The library's output processing calls +jpeg_consume_input() whenever the current input scan number and row within +that scan is less than or equal to the current output scan number and row. +Thus, input processing can "get ahead" of the output processing but is not +allowed to "fall behind". You can achieve several different effects by +manipulating this interlock rule. For example, if you pass a target scan +number greater than the current input scan number, the output processor will +wait until that scan starts to arrive before producing any output. (To avoid +an infinite loop, the target scan number is automatically reset to the last +scan number when the end of image is reached. Thus, if you specify a large +target scan number, the library will just absorb the entire input file and +then perform an output pass. This is effectively the same as what +jpeg_start_decompress() does when you don't select buffered-image mode.) +When you pass a target scan number equal to the current input scan number, +the image is displayed no faster than the current input scan arrives. The +final possibility is to pass a target scan number less than the current input +scan number; this disables the input/output interlock and causes the output +processor to simply display whatever it finds in the image buffer, without +waiting for input. (However, the library will not accept a target scan +number less than one, so you can't avoid waiting for the first scan.) + +When data is arriving faster than the output display processing can advance +through the image, jpeg_consume_input() will store data into the buffered +image beyond the point at which the output processing is reading data out +again. If the input arrives fast enough, it may "wrap around" the buffer to +the point where the input is more than one whole scan ahead of the output. +If the output processing simply proceeds through its display pass without +paying attention to the input, the effect seen on-screen is that the lower +part of the image is one or more scans better in quality than the upper part. +Then, when the next output scan is started, you have a choice of what target +scan number to use. The recommended choice is to use the current input scan +number at that time, which implies that you've skipped the output scans +corresponding to the input scans that were completed while you processed the +previous output scan. In this way, the decoder automatically adapts its +speed to the arriving data, by skipping output scans as necessary to keep up +with the arriving data. + +When using this strategy, you'll want to be sure that you perform a final +output pass after receiving all the data; otherwise your last display may not +be full quality across the whole screen. So the right outer loop logic is +something like this: + do { + absorb any waiting input by calling jpeg_consume_input() + final_pass = jpeg_input_complete(&cinfo); + adjust output decompression parameters if required + jpeg_start_output(&cinfo, cinfo.input_scan_number); + ... + jpeg_finish_output() + } while (! final_pass); +rather than quitting as soon as jpeg_input_complete() returns TRUE. This +arrangement makes it simple to use higher-quality decoding parameters +for the final pass. But if you don't want to use special parameters for +the final pass, the right loop logic is like this: + for (;;) { + absorb any waiting input by calling jpeg_consume_input() + jpeg_start_output(&cinfo, cinfo.input_scan_number); + ... + jpeg_finish_output() + if (jpeg_input_complete(&cinfo) && + cinfo.input_scan_number == cinfo.output_scan_number) + break; + } +In this case you don't need to know in advance whether an output pass is to +be the last one, so it's not necessary to have reached EOF before starting +the final output pass; rather, what you want to test is whether the output +pass was performed in sync with the final input scan. This form of the loop +will avoid an extra output pass whenever the decoder is able (or nearly able) +to keep up with the incoming data. + +When the data transmission speed is high, you might begin a display pass, +then find that much or all of the file has arrived before you can complete +the pass. (You can detect this by noting the JPEG_REACHED_EOI return code +from jpeg_consume_input(), or equivalently by testing jpeg_input_complete().) +In this situation you may wish to abort the current display pass and start a +new one using the newly arrived information. To do so, just call +jpeg_finish_output() and then start a new pass with jpeg_start_output(). + +A variant strategy is to abort and restart display if more than one complete +scan arrives during an output pass; this can be detected by noting +JPEG_REACHED_SOS returns and/or examining cinfo.input_scan_number. This +idea should be employed with caution, however, since the display process +might never get to the bottom of the image before being aborted, resulting +in the lower part of the screen being several passes worse than the upper. +In most cases it's probably best to abort an output pass only if the whole +file has arrived and you want to begin the final output pass immediately. + +When receiving data across a communication link, we recommend always using +the current input scan number for the output target scan number; if a +higher-quality final pass is to be done, it should be started (aborting any +incomplete output pass) as soon as the end of file is received. However, +many other strategies are possible. For example, the application can examine +the parameters of the current input scan and decide whether to display it or +not. If the scan contains only chroma data, one might choose not to use it +as the target scan, expecting that the scan will be small and will arrive +quickly. To skip to the next scan, call jpeg_consume_input() until it +returns JPEG_REACHED_SOS or JPEG_REACHED_EOI. Or just use the next higher +number as the target scan for jpeg_start_output(); but that method doesn't +let you inspect the next scan's parameters before deciding to display it. + + +In buffered-image mode, jpeg_start_decompress() never performs input and +thus never suspends. An application that uses input suspension with +buffered-image mode must be prepared for suspension returns from these +routines: +* jpeg_start_output() performs input only if you request 2-pass quantization + and the target scan isn't fully read yet. (This is discussed below.) +* jpeg_read_scanlines(), as always, returns the number of scanlines that it + was able to produce before suspending. +* jpeg_finish_output() will read any markers following the target scan, + up to the end of the file or the SOS marker that begins another scan. + (But it reads no input if jpeg_consume_input() has already reached the + end of the file or a SOS marker beyond the target output scan.) +* jpeg_finish_decompress() will read until the end of file, and thus can + suspend if the end hasn't already been reached (as can be tested by + calling jpeg_input_complete()). +jpeg_start_output(), jpeg_finish_output(), and jpeg_finish_decompress() +all return TRUE if they completed their tasks, FALSE if they had to suspend. +In the event of a FALSE return, the application must load more input data +and repeat the call. Applications that use non-suspending data sources need +not check the return values of these three routines. + + +It is possible to change decoding parameters between output passes in the +buffered-image mode. The decoder library currently supports only very +limited changes of parameters. ONLY THE FOLLOWING parameter changes are +allowed after jpeg_start_decompress() is called: +* dct_method can be changed before each call to jpeg_start_output(). + For example, one could use a fast DCT method for early scans, changing + to a higher quality method for the final scan. +* dither_mode can be changed before each call to jpeg_start_output(); + of course this has no impact if not using color quantization. Typically + one would use ordered dither for initial passes, then switch to + Floyd-Steinberg dither for the final pass. Caution: changing dither mode + can cause more memory to be allocated by the library. Although the amount + of memory involved is not large (a scanline or so), it may cause the + initial max_memory_to_use specification to be exceeded, which in the worst + case would result in an out-of-memory failure. +* do_block_smoothing can be changed before each call to jpeg_start_output(). + This setting is relevant only when decoding a progressive JPEG image. + During the first DC-only scan, block smoothing provides a very "fuzzy" look + instead of the very "blocky" look seen without it; which is better seems a + matter of personal taste. But block smoothing is nearly always a win + during later stages, especially when decoding a successive-approximation + image: smoothing helps to hide the slight blockiness that otherwise shows + up on smooth gradients until the lowest coefficient bits are sent. +* Color quantization mode can be changed under the rules described below. + You *cannot* change between full-color and quantized output (because that + would alter the required I/O buffer sizes), but you can change which + quantization method is used. + +When generating color-quantized output, changing quantization method is a +very useful way of switching between high-speed and high-quality display. +The library allows you to change among its three quantization methods: +1. Single-pass quantization to a fixed color cube. + Selected by cinfo.two_pass_quantize = FALSE and cinfo.colormap = NULL. +2. Single-pass quantization to an application-supplied colormap. + Selected by setting cinfo.colormap to point to the colormap (the value of + two_pass_quantize is ignored); also set cinfo.actual_number_of_colors. +3. Two-pass quantization to a colormap chosen specifically for the image. + Selected by cinfo.two_pass_quantize = TRUE and cinfo.colormap = NULL. + (This is the default setting selected by jpeg_read_header, but it is + probably NOT what you want for the first pass of progressive display!) +These methods offer successively better quality and lesser speed. However, +only the first method is available for quantizing in non-RGB color spaces. + +IMPORTANT: because the different quantizer methods have very different +working-storage requirements, the library requires you to indicate which +one(s) you intend to use before you call jpeg_start_decompress(). (If we did +not require this, the max_memory_to_use setting would be a complete fiction.) +You do this by setting one or more of these three cinfo fields to TRUE: + enable_1pass_quant Fixed color cube colormap + enable_external_quant Externally-supplied colormap + enable_2pass_quant Two-pass custom colormap +All three are initialized FALSE by jpeg_read_header(). But +jpeg_start_decompress() automatically sets TRUE the one selected by the +current two_pass_quantize and colormap settings, so you only need to set the +enable flags for any other quantization methods you plan to change to later. + +After setting the enable flags correctly at jpeg_start_decompress() time, you +can change to any enabled quantization method by setting two_pass_quantize +and colormap properly just before calling jpeg_start_output(). The following +special rules apply: +1. You must explicitly set cinfo.colormap to NULL when switching to 1-pass + or 2-pass mode from a different mode, or when you want the 2-pass + quantizer to be re-run to generate a new colormap. +2. To switch to an external colormap, or to change to a different external + colormap than was used on the prior pass, you must call + jpeg_new_colormap() after setting cinfo.colormap. +NOTE: if you want to use the same colormap as was used in the prior pass, +you should not do either of these things. This will save some nontrivial +switchover costs. +(These requirements exist because cinfo.colormap will always be non-NULL +after completing a prior output pass, since both the 1-pass and 2-pass +quantizers set it to point to their output colormaps. Thus you have to +do one of these two things to notify the library that something has changed. +Yup, it's a bit klugy, but it's necessary to do it this way for backwards +compatibility.) + +Note that in buffered-image mode, the library generates any requested colormap +during jpeg_start_output(), not during jpeg_start_decompress(). + +When using two-pass quantization, jpeg_start_output() makes a pass over the +buffered image to determine the optimum color map; it therefore may take a +significant amount of time, whereas ordinarily it does little work. The +progress monitor hook is called during this pass, if defined. It is also +important to realize that if the specified target scan number is greater than +or equal to the current input scan number, jpeg_start_output() will attempt +to consume input as it makes this pass. If you use a suspending data source, +you need to check for a FALSE return from jpeg_start_output() under these +conditions. The combination of 2-pass quantization and a not-yet-fully-read +target scan is the only case in which jpeg_start_output() will consume input. + + +Application authors who support buffered-image mode may be tempted to use it +for all JPEG images, even single-scan ones. This will work, but it is +inefficient: there is no need to create an image-sized coefficient buffer for +single-scan images. Requesting buffered-image mode for such an image wastes +memory. Worse, it can cost time on large images, since the buffered data has +to be swapped out or written to a temporary file. If you are concerned about +maximum performance on baseline JPEG files, you should use buffered-image +mode only when the incoming file actually has multiple scans. This can be +tested by calling jpeg_has_multiple_scans(), which will return a correct +result at any time after jpeg_read_header() completes. + +It is also worth noting that when you use jpeg_consume_input() to let input +processing get ahead of output processing, the resulting pattern of access to +the coefficient buffer is quite nonsequential. It's best to use the memory +manager jmemnobs.c if you can (ie, if you have enough real or virtual main +memory). If not, at least make sure that max_memory_to_use is set as high as +possible. If the JPEG memory manager has to use a temporary file, you will +probably see a lot of disk traffic and poor performance. (This could be +improved with additional work on the memory manager, but we haven't gotten +around to it yet.) + +In some applications it may be convenient to use jpeg_consume_input() for all +input processing, including reading the initial markers; that is, you may +wish to call jpeg_consume_input() instead of jpeg_read_header() during +startup. This works, but note that you must check for JPEG_REACHED_SOS and +JPEG_REACHED_EOI return codes as the equivalent of jpeg_read_header's codes. +Once the first SOS marker has been reached, you must call +jpeg_start_decompress() before jpeg_consume_input() will consume more input; +it'll just keep returning JPEG_REACHED_SOS until you do. If you read a +tables-only file this way, jpeg_consume_input() will return JPEG_REACHED_EOI +without ever returning JPEG_REACHED_SOS; be sure to check for this case. +If this happens, the decompressor will not read any more input until you call +jpeg_abort() to reset it. It is OK to call jpeg_consume_input() even when not +using buffered-image mode, but in that case it's basically a no-op after the +initial markers have been read: it will just return JPEG_SUSPENDED. + + +Abbreviated datastreams and multiple images +------------------------------------------- + +A JPEG compression or decompression object can be reused to process multiple +images. This saves a small amount of time per image by eliminating the +"create" and "destroy" operations, but that isn't the real purpose of the +feature. Rather, reuse of an object provides support for abbreviated JPEG +datastreams. Object reuse can also simplify processing a series of images in +a single input or output file. This section explains these features. + +A JPEG file normally contains several hundred bytes worth of quantization +and Huffman tables. In a situation where many images will be stored or +transmitted with identical tables, this may represent an annoying overhead. +The JPEG standard therefore permits tables to be omitted. The standard +defines three classes of JPEG datastreams: + * "Interchange" datastreams contain an image and all tables needed to decode + the image. These are the usual kind of JPEG file. + * "Abbreviated image" datastreams contain an image, but are missing some or + all of the tables needed to decode that image. + * "Abbreviated table specification" (henceforth "tables-only") datastreams + contain only table specifications. +To decode an abbreviated image, it is necessary to load the missing table(s) +into the decoder beforehand. This can be accomplished by reading a separate +tables-only file. A variant scheme uses a series of images in which the first +image is an interchange (complete) datastream, while subsequent ones are +abbreviated and rely on the tables loaded by the first image. It is assumed +that once the decoder has read a table, it will remember that table until a +new definition for the same table number is encountered. + +It is the application designer's responsibility to figure out how to associate +the correct tables with an abbreviated image. While abbreviated datastreams +can be useful in a closed environment, their use is strongly discouraged in +any situation where data exchange with other applications might be needed. +Caveat designer. + +The JPEG library provides support for reading and writing any combination of +tables-only datastreams and abbreviated images. In both compression and +decompression objects, a quantization or Huffman table will be retained for +the lifetime of the object, unless it is overwritten by a new table definition. + + +To create abbreviated image datastreams, it is only necessary to tell the +compressor not to emit some or all of the tables it is using. Each +quantization and Huffman table struct contains a boolean field "sent_table", +which normally is initialized to FALSE. For each table used by the image, the +header-writing process emits the table and sets sent_table = TRUE unless it is +already TRUE. (In normal usage, this prevents outputting the same table +definition multiple times, as would otherwise occur because the chroma +components typically share tables.) Thus, setting this field to TRUE before +calling jpeg_start_compress() will prevent the table from being written at +all. + +If you want to create a "pure" abbreviated image file containing no tables, +just call "jpeg_suppress_tables(&cinfo, TRUE)" after constructing all the +tables. If you want to emit some but not all tables, you'll need to set the +individual sent_table fields directly. + +To create an abbreviated image, you must also call jpeg_start_compress() +with a second parameter of FALSE, not TRUE. Otherwise jpeg_start_compress() +will force all the sent_table fields to FALSE. (This is a safety feature to +prevent abbreviated images from being created accidentally.) + +To create a tables-only file, perform the same parameter setup that you +normally would, but instead of calling jpeg_start_compress() and so on, call +jpeg_write_tables(&cinfo). This will write an abbreviated datastream +containing only SOI, DQT and/or DHT markers, and EOI. All the quantization +and Huffman tables that are currently defined in the compression object will +be emitted unless their sent_tables flag is already TRUE, and then all the +sent_tables flags will be set TRUE. + +A sure-fire way to create matching tables-only and abbreviated image files +is to proceed as follows: + + create JPEG compression object + set JPEG parameters + set destination to tables-only file + jpeg_write_tables(&cinfo); + set destination to image file + jpeg_start_compress(&cinfo, FALSE); + write data... + jpeg_finish_compress(&cinfo); + +Since the JPEG parameters are not altered between writing the table file and +the abbreviated image file, the same tables are sure to be used. Of course, +you can repeat the jpeg_start_compress() ... jpeg_finish_compress() sequence +many times to produce many abbreviated image files matching the table file. + +You cannot suppress output of the computed Huffman tables when Huffman +optimization is selected. (If you could, there'd be no way to decode the +image...) Generally, you don't want to set optimize_coding = TRUE when +you are trying to produce abbreviated files. + +In some cases you might want to compress an image using tables which are +not stored in the application, but are defined in an interchange or +tables-only file readable by the application. This can be done by setting up +a JPEG decompression object to read the specification file, then copying the +tables into your compression object. See jpeg_copy_critical_parameters() +for an example of copying quantization tables. + + +To read abbreviated image files, you simply need to load the proper tables +into the decompression object before trying to read the abbreviated image. +If the proper tables are stored in the application program, you can just +allocate the table structs and fill in their contents directly. For example, +to load a fixed quantization table into table slot "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]; /* quant_ptr is JQUANT_TBL* */ + for (i = 0; i < 64; i++) { + /* Qtable[] is desired quantization table, in natural array order */ + quant_ptr->quantval[i] = Qtable[i]; + } + +Code to load a fixed Huffman table is typically (for AC table "n"): + + if (cinfo.ac_huff_tbl_ptrs[n] == NULL) + cinfo.ac_huff_tbl_ptrs[n] = jpeg_alloc_huff_table((j_common_ptr) &cinfo); + huff_ptr = cinfo.ac_huff_tbl_ptrs[n]; /* huff_ptr is JHUFF_TBL* */ + for (i = 1; i <= 16; i++) { + /* counts[i] is number of Huffman codes of length i bits, i=1..16 */ + huff_ptr->bits[i] = counts[i]; + } + for (i = 0; i < 256; i++) { + /* symbols[] is the list of Huffman symbols, in code-length order */ + huff_ptr->huffval[i] = symbols[i]; + } + +(Note that trying to set cinfo.quant_tbl_ptrs[n] to point directly at a +constant JQUANT_TBL object is not safe. If the incoming file happened to +contain a quantization table definition, your master table would get +overwritten! Instead allocate a working table copy and copy the master table +into it, as illustrated above. Ditto for Huffman tables, of course.) + +You might want to read the tables from a tables-only file, rather than +hard-wiring them into your application. The jpeg_read_header() call is +sufficient to read a tables-only file. You must pass a second parameter of +FALSE to indicate that you do not require an image to be present. Thus, the +typical scenario is + + create JPEG decompression object + set source to tables-only file + jpeg_read_header(&cinfo, FALSE); + set source to abbreviated image file + jpeg_read_header(&cinfo, TRUE); + set decompression parameters + jpeg_start_decompress(&cinfo); + read data... + jpeg_finish_decompress(&cinfo); + +In some cases, you may want to read a file without knowing whether it contains +an image or just tables. In that case, pass FALSE and check the return value +from jpeg_read_header(): it will be JPEG_HEADER_OK if an image was found, +JPEG_HEADER_TABLES_ONLY if only tables were found. (A third return value, +JPEG_SUSPENDED, is possible when using a suspending data source manager.) +Note that jpeg_read_header() will not complain if you read an abbreviated +image for which you haven't loaded the missing tables; the missing-table check +occurs later, in jpeg_start_decompress(). + + +It is possible to read a series of images from a single source file by +repeating the jpeg_read_header() ... jpeg_finish_decompress() sequence, +without releasing/recreating the JPEG object or the data source module. +(If you did reinitialize, any partial bufferload left in the data source +buffer at the end of one image would be discarded, causing you to lose the +start of the next image.) When you use this method, stored tables are +automatically carried forward, so some of the images can be abbreviated images +that depend on tables from earlier images. + +If you intend to write a series of images into a single destination file, +you might want to make a specialized data destination module that doesn't +flush the output buffer at term_destination() time. This would speed things +up by some trifling amount. Of course, you'd need to remember to flush the +buffer after the last image. You can make the later images be abbreviated +ones by passing FALSE to jpeg_start_compress(). + + +Special markers +--------------- + +Some applications may need to insert or extract special data in the JPEG +datastream. The JPEG standard provides marker types "COM" (comment) and +"APP0" through "APP15" (application) to hold application-specific data. +Unfortunately, the use of these markers is not specified by the standard. +COM markers are fairly widely used to hold user-supplied text. The JFIF file +format spec uses APP0 markers with specified initial strings to hold certain +data. Adobe applications use APP14 markers beginning with the string "Adobe" +for miscellaneous data. Other APPn markers are rarely seen, but might +contain almost anything. + +If you wish to store user-supplied text, we recommend you use COM markers +and place readable 7-bit ASCII text in them. Newline conventions are not +standardized --- expect to find LF (Unix style), CR/LF (DOS style), or CR +(Mac style). A robust COM reader should be able to cope with random binary +garbage, including nulls, since some applications generate COM markers +containing non-ASCII junk. (But yours should not be one of them.) + +For program-supplied data, use an APPn marker, and be sure to begin it with an +identifying string so that you can tell whether the marker is actually yours. +It's probably best to avoid using APP0 or APP14 for any private markers. +(NOTE: the upcoming SPIFF standard will use APP8 markers; we recommend you +not use APP8 markers for any private purposes, either.) + +Keep in mind that at most 65533 bytes can be put into one marker, but you +can have as many markers as you like. + +By default, the IJG compression library will write a JFIF APP0 marker if the +selected JPEG colorspace is grayscale or YCbCr, or an Adobe APP14 marker if +the selected colorspace is RGB, CMYK, or YCCK. You can disable this, but +we don't recommend it. The decompression library will recognize JFIF and +Adobe markers and will set the JPEG colorspace properly when one is found. + + +You can write special markers immediately following the datastream header by +calling jpeg_write_marker() after jpeg_start_compress() and before the first +call to jpeg_write_scanlines(). When you do this, the markers appear after +the SOI and the JFIF APP0 and Adobe APP14 markers (if written), but before +all else. Specify the marker type parameter as "JPEG_COM" for COM or +"JPEG_APP0 + n" for APPn. (Actually, jpeg_write_marker will let you write +any marker type, but we don't recommend writing any other kinds of marker.) +For example, to write a user comment string pointed to by comment_text: + jpeg_write_marker(cinfo, JPEG_COM, comment_text, strlen(comment_text)); + +If it's not convenient to store all the marker data in memory at once, +you can instead call jpeg_write_m_header() followed by multiple calls to +jpeg_write_m_byte(). If you do it this way, it's your responsibility to +call jpeg_write_m_byte() exactly the number of times given in the length +parameter to jpeg_write_m_header(). (This method lets you empty the +output buffer partway through a marker, which might be important when +using a suspending data destination module. In any case, if you are using +a suspending destination, you should flush its buffer after inserting +any special markers. See "I/O suspension".) + +Or, if you prefer to synthesize the marker byte sequence yourself, +you can just cram it straight into the data destination module. + +If you are writing JFIF 1.02 extension markers (thumbnail images), don't +forget to set cinfo.JFIF_minor_version = 2 so that the encoder will write the +correct JFIF version number in the JFIF header marker. The library's default +is to write version 1.01, but that's wrong if you insert any 1.02 extension +markers. (We could probably get away with just defaulting to 1.02, but there +used to be broken decoders that would complain about unknown minor version +numbers. To reduce compatibility risks it's safest not to write 1.02 unless +you are actually using 1.02 extensions.) + + +When reading, two methods of handling special markers are available: +1. You can ask the library to save the contents of COM and/or APPn markers +into memory, and then examine them at your leisure afterwards. +2. You can supply your own routine to process COM and/or APPn markers +on-the-fly as they are read. +The first method is simpler to use, especially if you are using a suspending +data source; writing a marker processor that copes with input suspension is +not easy (consider what happens if the marker is longer than your available +input buffer). However, the second method conserves memory since the marker +data need not be kept around after it's been processed. + +For either method, you'd normally set up marker handling after creating a +decompression object and before calling jpeg_read_header(), because the +markers of interest will typically be near the head of the file and so will +be scanned by jpeg_read_header. Once you've established a marker handling +method, it will be used for the life of that decompression object +(potentially many datastreams), unless you change it. Marker handling is +determined separately for COM markers and for each APPn marker code. + + +To save the contents of special markers in memory, call + jpeg_save_markers(cinfo, marker_code, length_limit) +where marker_code is the marker type to save, JPEG_COM or JPEG_APP0+n. +(To arrange to save all the special marker types, you need to call this +routine 17 times, for COM and APP0-APP15.) If the incoming marker is longer +than length_limit data bytes, only length_limit bytes will be saved; this +parameter allows you to avoid chewing up memory when you only need to see the +first few bytes of a potentially large marker. If you want to save all the +data, set length_limit to 0xFFFF; that is enough since marker lengths are only +16 bits. As a special case, setting length_limit to 0 prevents that marker +type from being saved at all. (That is the default behavior, in fact.) + +After jpeg_read_header() completes, you can examine the special markers by +following the cinfo->marker_list pointer chain. All the special markers in +the file appear in this list, in order of their occurrence in the file (but +omitting any markers of types you didn't ask for). Both the original data +length and the saved data length are recorded for each list entry; the latter +will not exceed length_limit for the particular marker type. Note that these +lengths exclude the marker length word, whereas the stored representation +within the JPEG file includes it. (Hence the maximum data length is really +only 65533.) + +It is possible that additional special markers appear in the file beyond the +SOS marker at which jpeg_read_header stops; if so, the marker list will be +extended during reading of the rest of the file. This is not expected to be +common, however. If you are short on memory you may want to reset the length +limit to zero for all marker types after finishing jpeg_read_header, to +ensure that the max_memory_to_use setting cannot be exceeded due to addition +of later markers. + +The marker list remains stored until you call jpeg_finish_decompress or +jpeg_abort, at which point the memory is freed and the list is set to empty. +(jpeg_destroy also releases the storage, of course.) + +Note that the library is internally interested in APP0 and APP14 markers; +if you try to set a small nonzero length limit on these types, the library +will silently force the length up to the minimum it wants. (But you can set +a zero length limit to prevent them from being saved at all.) Also, in a +16-bit environment, the maximum length limit may be constrained to less than +65533 by malloc() limitations. It is therefore best not to assume that the +effective length limit is exactly what you set it to be. + + +If you want to supply your own marker-reading routine, you do it by calling +jpeg_set_marker_processor(). A marker processor routine must have the +signature + boolean jpeg_marker_parser_method (j_decompress_ptr cinfo) +Although the marker code is not explicitly passed, the routine can find it +in cinfo->unread_marker. At the time of call, the marker proper has been +read from the data source module. The processor routine is responsible for +reading the marker length word and the remaining parameter bytes, if any. +Return TRUE to indicate success. (FALSE should be returned only if you are +using a suspending data source and it tells you to suspend. See the standard +marker processors in jdmarker.c for appropriate coding methods if you need to +use a suspending data source.) + +If you override the default APP0 or APP14 processors, it is up to you to +recognize JFIF and Adobe markers if you want colorspace recognition to occur +properly. We recommend copying and extending the default processors if you +want to do that. (A better idea is to save these marker types for later +examination by calling jpeg_save_markers(); that method doesn't interfere +with the library's own processing of these markers.) + +jpeg_set_marker_processor() and jpeg_save_markers() are mutually exclusive +--- if you call one it overrides any previous call to the other, for the +particular marker type specified. + +A simple example of an external COM processor can be found in djpeg.c. +Also, see jpegtran.c for an example of using jpeg_save_markers. + + +Raw (downsampled) image data +---------------------------- + +Some applications need to supply already-downsampled image data to the JPEG +compressor, or to receive raw downsampled data from the decompressor. The +library supports this requirement by allowing the application to write or +read raw data, bypassing the normal preprocessing or postprocessing steps. +The interface is different from the standard one and is somewhat harder to +use. If your interest is merely in bypassing color conversion, we recommend +that you use the standard interface and simply set jpeg_color_space = +in_color_space (or jpeg_color_space = out_color_space for decompression). +The mechanism described in this section is necessary only to supply or +receive downsampled image data, in which not all components have the same +dimensions. + + +To compress raw data, you must supply the data in the colorspace to be used +in the JPEG file (please read the earlier section on Special color spaces) +and downsampled to the sampling factors specified in the JPEG parameters. +You must supply the data in the format used internally by the JPEG library, +namely a JSAMPIMAGE array. This is an array of pointers to two-dimensional +arrays, each of type JSAMPARRAY. Each 2-D array holds the values for one +color component. This structure is necessary since the components are of +different sizes. If the image dimensions are not a multiple of the MCU size, +you must also pad the data correctly (usually, this is done by replicating +the last column and/or row). The data must be padded to a multiple of a DCT +block in each component: that is, each downsampled row must contain a +multiple of 8 valid samples, and there must be a multiple of 8 sample rows +for each component. (For applications such as conversion of digital TV +images, the standard image size is usually a multiple of the DCT block size, +so that no padding need actually be done.) + +The procedure for compression of raw data is basically the same as normal +compression, except that you call jpeg_write_raw_data() in place of +jpeg_write_scanlines(). Before calling jpeg_start_compress(), you must do +the following: + * Set cinfo->raw_data_in to TRUE. (It is set FALSE by jpeg_set_defaults().) + This notifies the library that you will be supplying raw data. + Furthermore, set cinfo->do_fancy_downsampling to FALSE if you want to use + real downsampled data. (It is set TRUE by jpeg_set_defaults().) + * Ensure jpeg_color_space is correct --- an explicit jpeg_set_colorspace() + call is a good idea. Note that since color conversion is bypassed, + in_color_space is ignored, except that jpeg_set_defaults() uses it to + choose the default jpeg_color_space setting. + * Ensure the sampling factors, cinfo->comp_info[i].h_samp_factor and + cinfo->comp_info[i].v_samp_factor, are correct. Since these indicate the + dimensions of the data you are supplying, it's wise to set them + explicitly, rather than assuming the library's defaults are what you want. + +To pass raw data to the library, call jpeg_write_raw_data() in place of +jpeg_write_scanlines(). The two routines work similarly except that +jpeg_write_raw_data takes a JSAMPIMAGE data array rather than JSAMPARRAY. +The scanlines count passed to and returned from jpeg_write_raw_data is +measured in terms of the component with the largest v_samp_factor. + +jpeg_write_raw_data() processes one MCU row per call, which is to say +v_samp_factor*DCTSIZE sample rows of each component. The passed num_lines +value must be at least max_v_samp_factor*DCTSIZE, and the return value will +be exactly that amount (or possibly some multiple of that amount, in future +library versions). This is true even on the last call at the bottom of the +image; don't forget to pad your data as necessary. + +The required dimensions of the supplied data can be computed for each +component as + cinfo->comp_info[i].width_in_blocks*DCTSIZE samples per row + cinfo->comp_info[i].height_in_blocks*DCTSIZE rows in image +after jpeg_start_compress() has initialized those fields. If the valid data +is smaller than this, it must be padded appropriately. For some sampling +factors and image sizes, additional dummy DCT blocks are inserted to make +the image a multiple of the MCU dimensions. The library creates such dummy +blocks itself; it does not read them from your supplied data. Therefore you +need never pad by more than DCTSIZE samples. An example may help here. +Assume 2h2v downsampling of YCbCr data, that is + cinfo->comp_info[0].h_samp_factor = 2 for Y + cinfo->comp_info[0].v_samp_factor = 2 + cinfo->comp_info[1].h_samp_factor = 1 for Cb + cinfo->comp_info[1].v_samp_factor = 1 + cinfo->comp_info[2].h_samp_factor = 1 for Cr + cinfo->comp_info[2].v_samp_factor = 1 +and suppose that the nominal image dimensions (cinfo->image_width and +cinfo->image_height) are 101x101 pixels. Then jpeg_start_compress() will +compute downsampled_width = 101 and width_in_blocks = 13 for Y, +downsampled_width = 51 and width_in_blocks = 7 for Cb and Cr (and the same +for the height fields). You must pad the Y data to at least 13*8 = 104 +columns and rows, the Cb/Cr data to at least 7*8 = 56 columns and rows. The +MCU height is max_v_samp_factor = 2 DCT rows so you must pass at least 16 +scanlines on each call to jpeg_write_raw_data(), which is to say 16 actual +sample rows of Y and 8 each of Cb and Cr. A total of 7 MCU rows are needed, +so you must pass a total of 7*16 = 112 "scanlines". The last DCT block row +of Y data is dummy, so it doesn't matter what you pass for it in the data +arrays, but the scanlines count must total up to 112 so that all of the Cb +and Cr data gets passed. + +Output suspension is supported with raw-data compression: if the data +destination module suspends, jpeg_write_raw_data() will return 0. +In this case the same data rows must be passed again on the next call. + + +Decompression with raw data output implies bypassing all postprocessing. +You must deal with the color space and sampling factors present in the +incoming file. If your application only handles, say, 2h1v YCbCr data, +you must check for and fail on other color spaces or other sampling factors. +The library will not convert to a different color space for you. + +To obtain raw data output, set cinfo->raw_data_out = TRUE before +jpeg_start_decompress() (it is set FALSE by jpeg_read_header()). Be sure to +verify that the color space and sampling factors are ones you can handle. +Furthermore, set cinfo->do_fancy_upsampling = FALSE if you want to get real +downsampled data (it is set TRUE by jpeg_read_header()). +Then call jpeg_read_raw_data() in place of jpeg_read_scanlines(). The +decompression process is otherwise the same as usual. + +jpeg_read_raw_data() returns one MCU row per call, and thus you must pass a +buffer of at least max_v_samp_factor*DCTSIZE scanlines (scanline counting is +the same as for raw-data compression). The buffer you pass must be large +enough to hold the actual data plus padding to DCT-block boundaries. As with +compression, any entirely dummy DCT blocks are not processed so you need not +allocate space for them, but the total scanline count includes them. The +above example of computing buffer dimensions for raw-data compression is +equally valid for decompression. + +Input suspension is supported with raw-data decompression: if the data source +module suspends, jpeg_read_raw_data() will return 0. You can also use +buffered-image mode to read raw data in multiple passes. + + +Really raw data: DCT coefficients +--------------------------------- + +It is possible to read or write the contents of a JPEG file as raw DCT +coefficients. This facility is mainly intended for use in lossless +transcoding between different JPEG file formats. Other possible applications +include lossless cropping of a JPEG image, lossless reassembly of a +multi-strip or multi-tile TIFF/JPEG file into a single JPEG datastream, etc. + +To read the contents of a JPEG file as DCT coefficients, open the file and do +jpeg_read_header() as usual. But instead of calling jpeg_start_decompress() +and jpeg_read_scanlines(), call jpeg_read_coefficients(). This will read the +entire image into a set of virtual coefficient-block arrays, one array per +component. The return value is a pointer to an array of virtual-array +descriptors. Each virtual array can be accessed directly using the JPEG +memory manager's access_virt_barray method (see Memory management, below, +and also read structure.txt's discussion of virtual array handling). Or, +for simple transcoding to a different JPEG file format, the array list can +just be handed directly to jpeg_write_coefficients(). + +Each block in the block arrays contains quantized coefficient values in +normal array order (not JPEG zigzag order). The block arrays contain only +DCT blocks containing real data; any entirely-dummy blocks added to fill out +interleaved MCUs at the right or bottom edges of the image are discarded +during reading and are not stored in the block arrays. (The size of each +block array can be determined from the width_in_blocks and height_in_blocks +fields of the component's comp_info entry.) This is also the data format +expected by jpeg_write_coefficients(). + +When you are done using the virtual arrays, call jpeg_finish_decompress() +to release the array storage and return the decompression object to an idle +state; or just call jpeg_destroy() if you don't need to reuse the object. + +If you use a suspending data source, jpeg_read_coefficients() will return +NULL if it is forced to suspend; a non-NULL return value indicates successful +completion. You need not test for a NULL return value when using a +non-suspending data source. + +It is also possible to call jpeg_read_coefficients() to obtain access to the +decoder's coefficient arrays during a normal decode cycle in buffered-image +mode. This frammish might be useful for progressively displaying an incoming +image and then re-encoding it without loss. To do this, decode in buffered- +image mode as discussed previously, then call jpeg_read_coefficients() after +the last jpeg_finish_output() call. The arrays will be available for your use +until you call jpeg_finish_decompress(). + + +To write the contents of a JPEG file as DCT coefficients, you must provide +the DCT coefficients stored in virtual block arrays. You can either pass +block arrays read from an input JPEG file by jpeg_read_coefficients(), or +allocate virtual arrays from the JPEG compression object and fill them +yourself. In either case, jpeg_write_coefficients() is substituted for +jpeg_start_compress() and jpeg_write_scanlines(). Thus the sequence is + * Create compression object + * Set all compression parameters as necessary + * Request virtual arrays if needed + * jpeg_write_coefficients() + * jpeg_finish_compress() + * Destroy or re-use compression object +jpeg_write_coefficients() is passed a pointer to an array of virtual block +array descriptors; the number of arrays is equal to cinfo.num_components. + +The virtual arrays need only have been requested, not realized, before +jpeg_write_coefficients() is called. A side-effect of +jpeg_write_coefficients() is to realize any virtual arrays that have been +requested from the compression object's memory manager. Thus, when obtaining +the virtual arrays from the compression object, you should fill the arrays +after calling jpeg_write_coefficients(). The data is actually written out +when you call jpeg_finish_compress(); jpeg_write_coefficients() only writes +the file header. + +When writing raw DCT coefficients, it is crucial that the JPEG quantization +tables and sampling factors match the way the data was encoded, or the +resulting file will be invalid. For transcoding from an existing JPEG file, +we recommend using jpeg_copy_critical_parameters(). This routine initializes +all the compression parameters to default values (like jpeg_set_defaults()), +then copies the critical information from a source decompression object. +The decompression object should have just been used to read the entire +JPEG input file --- that is, it should be awaiting jpeg_finish_decompress(). + +jpeg_write_coefficients() marks all tables stored in the compression object +as needing to be written to the output file (thus, it acts like +jpeg_start_compress(cinfo, TRUE)). This is for safety's sake, to avoid +emitting abbreviated JPEG files by accident. If you really want to emit an +abbreviated JPEG file, call jpeg_suppress_tables(), or set the tables' +individual sent_table flags, between calling jpeg_write_coefficients() and +jpeg_finish_compress(). + + +Progress monitoring +------------------- + +Some applications may need to regain control from the JPEG library every so +often. The typical use of this feature is to produce a percent-done bar or +other progress display. (For a simple example, see cjpeg.c or djpeg.c.) +Although you do get control back frequently during the data-transferring pass +(the jpeg_read_scanlines or jpeg_write_scanlines loop), any additional passes +will occur inside jpeg_finish_compress or jpeg_start_decompress; those +routines may take a long time to execute, and you don't get control back +until they are done. + +You can define a progress-monitor routine which will be called periodically +by the library. No guarantees are made about how often this call will occur, +so we don't recommend you use it for mouse tracking or anything like that. +At present, a call will occur once per MCU row, scanline, or sample row +group, whichever unit is convenient for the current processing mode; so the +wider the image, the longer the time between calls. During the data +transferring pass, only one call occurs per call of jpeg_read_scanlines or +jpeg_write_scanlines, so don't pass a large number of scanlines at once if +you want fine resolution in the progress count. (If you really need to use +the callback mechanism for time-critical tasks like mouse tracking, you could +insert additional calls inside some of the library's inner loops.) + +To establish a progress-monitor callback, create a struct jpeg_progress_mgr, +fill in its progress_monitor field with a pointer to your callback routine, +and set cinfo->progress to point to the struct. The callback will be called +whenever cinfo->progress is non-NULL. (This pointer is set to NULL by +jpeg_create_compress or jpeg_create_decompress; the library will not change +it thereafter. So if you allocate dynamic storage for the progress struct, +make sure it will live as long as the JPEG object does. Allocating from the +JPEG memory manager with lifetime JPOOL_PERMANENT will work nicely.) You +can use the same callback routine for both compression and decompression. + +The jpeg_progress_mgr struct contains four fields which are set by the library: + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +During any one pass, pass_counter increases from 0 up to (not including) +pass_limit; the step size is usually but not necessarily 1. The pass_limit +value may change from one pass to another. The expected total number of +passes is in total_passes, and the number of passes already completed is in +completed_passes. Thus the fraction of work completed may be estimated as + completed_passes + (pass_counter/pass_limit) + -------------------------------------------- + total_passes +ignoring the fact that the passes may not be equal amounts of work. + +When decompressing, pass_limit can even change within a pass, because it +depends on the number of scans in the JPEG file, which isn't always known in +advance. The computed fraction-of-work-done may jump suddenly (if the library +discovers it has overestimated the number of scans) or even decrease (in the +opposite case). It is not wise to put great faith in the work estimate. + +When using the decompressor's buffered-image mode, the progress monitor work +estimate is likely to be completely unhelpful, because the library has no way +to know how many output passes will be demanded of it. Currently, the library +sets total_passes based on the assumption that there will be one more output +pass if the input file end hasn't yet been read (jpeg_input_complete() isn't +TRUE), but no more output passes if the file end has been reached when the +output pass is started. This means that total_passes will rise as additional +output passes are requested. If you have a way of determining the input file +size, estimating progress based on the fraction of the file that's been read +will probably be more useful than using the library's value. + + +Memory management +----------------- + +This section covers some key facts about the JPEG library's built-in memory +manager. For more info, please read structure.txt's section about the memory +manager, and consult the source code if necessary. + +All memory and temporary file allocation within the library is done via the +memory manager. If necessary, you can replace the "back end" of the memory +manager to control allocation yourself (for example, if you don't want the +library to use malloc() and free() for some reason). + +Some data is allocated "permanently" and will not be freed until the JPEG +object is destroyed. Most data is allocated "per image" and is freed by +jpeg_finish_compress, jpeg_finish_decompress, or jpeg_abort. You can call the +memory manager yourself to allocate structures that will automatically be +freed at these times. Typical code for this is + ptr = (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, size); +Use JPOOL_PERMANENT to get storage that lasts as long as the JPEG object. +Use alloc_large instead of alloc_small for anything bigger than a few Kbytes. +There are also alloc_sarray and alloc_barray routines that automatically +build 2-D sample or block arrays. + +The library's minimum space requirements to process an image depend on the +image's width, but not on its height, because the library ordinarily works +with "strip" buffers that are as wide as the image but just a few rows high. +Some operating modes (eg, two-pass color quantization) require full-image +buffers. Such buffers are treated as "virtual arrays": only the current strip +need be in memory, and the rest can be swapped out to a temporary file. + +If you use the simplest memory manager back end (jmemnobs.c), then no +temporary files are used; virtual arrays are simply malloc()'d. Images bigger +than memory can be processed only if your system supports virtual memory. +The other memory manager back ends support temporary files of various flavors +and thus work in machines without virtual memory. They may also be useful on +Unix machines if you need to process images that exceed available swap space. + +When using temporary files, the library will make the in-memory buffers for +its virtual arrays just big enough to stay within a "maximum memory" setting. +Your application can set this limit by setting cinfo->mem->max_memory_to_use +after creating the JPEG object. (Of course, there is still a minimum size for +the buffers, so the max-memory setting is effective only if it is bigger than +the minimum space needed.) If you allocate any large structures yourself, you +must allocate them before jpeg_start_compress() or jpeg_start_decompress() in +order to have them counted against the max memory limit. Also keep in mind +that space allocated with alloc_small() is ignored, on the assumption that +it's too small to be worth worrying about; so a reasonable safety margin +should be left when setting max_memory_to_use. + +If you use the jmemname.c or jmemdos.c memory manager back end, it is +important to clean up the JPEG object properly to ensure that the temporary +files get deleted. (This is especially crucial with jmemdos.c, where the +"temporary files" may be extended-memory segments; if they are not freed, +DOS will require a reboot to recover the memory.) Thus, with these memory +managers, it's a good idea to provide a signal handler that will trap any +early exit from your program. The handler should call either jpeg_abort() +or jpeg_destroy() for any active JPEG objects. A handler is not needed with +jmemnobs.c, and shouldn't be necessary with jmemansi.c or jmemmac.c either, +since the C library is supposed to take care of deleting files made with +tmpfile(). + + +Memory usage +------------ + +Working memory requirements while performing compression or decompression +depend on image dimensions, image characteristics (such as colorspace and +JPEG process), and operating mode (application-selected options). + +As of v6b, the decompressor requires: + 1. About 24K in more-or-less-fixed-size data. This varies a bit depending + on operating mode and image characteristics (particularly color vs. + grayscale), but it doesn't depend on image dimensions. + 2. Strip buffers (of size proportional to the image width) for IDCT and + upsampling results. The worst case for commonly used sampling factors + is about 34 bytes * width in pixels for a color image. A grayscale image + only needs about 8 bytes per pixel column. + 3. A full-image DCT coefficient buffer is needed to decode a multi-scan JPEG + file (including progressive JPEGs), or whenever you select buffered-image + mode. This takes 2 bytes/coefficient. At typical 2x2 sampling, that's + 3 bytes per pixel for a color image. Worst case (1x1 sampling) requires + 6 bytes/pixel. For grayscale, figure 2 bytes/pixel. + 4. To perform 2-pass color quantization, the decompressor also needs a + 128K color lookup table and a full-image pixel buffer (3 bytes/pixel). +This does not count any memory allocated by the application, such as a +buffer to hold the final output image. + +The above figures are valid for 8-bit JPEG data precision and a machine with +32-bit ints. For 12-bit JPEG data, double the size of the strip buffers and +quantization pixel buffer. The "fixed-size" data will be somewhat smaller +with 16-bit ints, larger with 64-bit ints. Also, CMYK or other unusual +color spaces will require different amounts of space. + +The full-image coefficient and pixel buffers, if needed at all, do not +have to be fully RAM resident; you can have the library use temporary +files instead when the total memory usage would exceed a limit you set. +(But if your OS supports virtual memory, it's probably better to just use +jmemnobs and let the OS do the swapping.) + +The compressor's memory requirements are similar, except that it has no need +for color quantization. Also, it needs a full-image DCT coefficient buffer +if Huffman-table optimization is asked for, even if progressive mode is not +requested. + +If you need more detailed information about memory usage in a particular +situation, you can enable the MEM_STATS code in jmemmgr.c. + + +Library compile-time options +---------------------------- + +A number of compile-time options are available by modifying jmorecfg.h. + +The JPEG standard provides for both the baseline 8-bit DCT process and +a 12-bit DCT process. The IJG code supports 12-bit lossy JPEG if you define +BITS_IN_JSAMPLE as 12 rather than 8. Note that this causes JSAMPLE to be +larger than a char, so it affects the surrounding application's image data. +The sample applications cjpeg and djpeg can support 12-bit mode only for PPM +and GIF file formats; you must disable the other file formats to compile a +12-bit cjpeg or djpeg. (install.txt has more information about that.) +At present, a 12-bit library can handle *only* 12-bit images, not both +precisions. (If you need to include both 8- and 12-bit libraries in a single +application, you could probably do it by defining NEED_SHORT_EXTERNAL_NAMES +for just one of the copies. You'd have to access the 8-bit and 12-bit copies +from separate application source files. This is untested ... if you try it, +we'd like to hear whether it works!) + +Note that a 12-bit library always compresses in Huffman optimization mode, +in order to generate valid Huffman tables. This is necessary because our +default Huffman tables only cover 8-bit data. If you need to output 12-bit +files in one pass, you'll have to supply suitable default Huffman tables. +You may also want to supply your own DCT quantization tables; the existing +quality-scaling code has been developed for 8-bit use, and probably doesn't +generate especially good tables for 12-bit. + +The maximum number of components (color channels) in the image is determined +by MAX_COMPONENTS. The JPEG standard allows up to 255 components, but we +expect that few applications will need more than four or so. + +On machines with unusual data type sizes, you may be able to improve +performance or reduce memory space by tweaking the various typedefs in +jmorecfg.h. In particular, on some RISC CPUs, access to arrays of "short"s +is quite slow; consider trading memory for speed by making JCOEF, INT16, and +UINT16 be "int" or "unsigned int". UINT8 is also a candidate to become int. +You probably don't want to make JSAMPLE be int unless you have lots of memory +to burn. + +You can reduce the size of the library by compiling out various optional +functions. To do this, undefine xxx_SUPPORTED symbols as necessary. + +You can also save a few K by not having text error messages in the library; +the standard error message table occupies about 5Kb. This is particularly +reasonable for embedded applications where there's no good way to display +a message anyway. To do this, remove the creation of the message table +(jpeg_std_message_table[]) from jerror.c, and alter format_message to do +something reasonable without it. You could output the numeric value of the +message code number, for example. If you do this, you can also save a couple +more K by modifying the TRACEMSn() macros in jerror.h to expand to nothing; +you don't need trace capability anyway, right? + + +Portability considerations +-------------------------- + +The JPEG library has been written to be extremely portable; the sample +applications cjpeg and djpeg are slightly less so. This section summarizes +the design goals in this area. (If you encounter any bugs that cause the +library to be less portable than is claimed here, we'd appreciate hearing +about them.) + +The code works fine on ANSI C, C++, and pre-ANSI C compilers, using any of +the popular system include file setups, and some not-so-popular ones too. +See install.txt for configuration procedures. + +The code is not dependent on the exact sizes of the C data types. As +distributed, we make the assumptions that + char is at least 8 bits wide + short is at least 16 bits wide + int is at least 16 bits wide + long is at least 32 bits wide +(These are the minimum requirements of the ANSI C standard.) Wider types will +work fine, although memory may be used inefficiently if char is much larger +than 8 bits or short is much bigger than 16 bits. The code should work +equally well with 16- or 32-bit ints. + +In a system where these assumptions are not met, you may be able to make the +code work by modifying the typedefs in jmorecfg.h. However, you will probably +have difficulty if int is less than 16 bits wide, since references to plain +int abound in the code. + +char can be either signed or unsigned, although the code runs faster if an +unsigned char type is available. If char is wider than 8 bits, you will need +to redefine JOCTET and/or provide custom data source/destination managers so +that JOCTET represents exactly 8 bits of data on external storage. + +The JPEG library proper does not assume ASCII representation of characters. +But some of the image file I/O modules in cjpeg/djpeg do have ASCII +dependencies in file-header manipulation; so does cjpeg's select_file_type() +routine. + +The JPEG library does not rely heavily on the C library. In particular, C +stdio is used only by the data source/destination modules and the error +handler, all of which are application-replaceable. (cjpeg/djpeg are more +heavily dependent on stdio.) malloc and free are called only from the memory +manager "back end" module, so you can use a different memory allocator by +replacing that one file. + +The code generally assumes that C names must be unique in the first 15 +characters. However, global function names can be made unique in the +first 6 characters by defining NEED_SHORT_EXTERNAL_NAMES. + +More info about porting the code may be gleaned by reading jconfig.txt, +jmorecfg.h, and jinclude.h. + + +Notes for MS-DOS implementors +----------------------------- + +The IJG code is designed to work efficiently in 80x86 "small" or "medium" +memory models (i.e., data pointers are 16 bits unless explicitly declared +"far"; code pointers can be either size). You may be able to use small +model to compile cjpeg or djpeg by itself, but you will probably have to use +medium model for any larger application. This won't make much difference in +performance. You *will* take a noticeable performance hit if you use a +large-data memory model (perhaps 10%-25%), and you should avoid "huge" model +if at all possible. + +The JPEG library typically needs 2Kb-3Kb of stack space. It will also +malloc about 20K-30K of near heap space while executing (and lots of far +heap, but that doesn't count in this calculation). This figure will vary +depending on selected operating mode, and to a lesser extent on image size. +There is also about 5Kb-6Kb of constant data which will be allocated in the +near data segment (about 4Kb of this is the error message table). +Thus you have perhaps 20K available for other modules' static data and near +heap space before you need to go to a larger memory model. The C library's +static data will account for several K of this, but that still leaves a good +deal for your needs. (If you are tight on space, you could reduce the sizes +of the I/O buffers allocated by jdatasrc.c and jdatadst.c, say from 4K to +1K. Another possibility is to move the error message table to far memory; +this should be doable with only localized hacking on jerror.c.) + +About 2K of the near heap space is "permanent" memory that will not be +released until you destroy the JPEG object. This is only an issue if you +save a JPEG object between compression or decompression operations. + +Far data space may also be a tight resource when you are dealing with large +images. The most memory-intensive case is decompression with two-pass color +quantization, or single-pass quantization to an externally supplied color +map. This requires a 128Kb color lookup table plus strip buffers amounting +to about 40 bytes per column for typical sampling ratios (eg, about 25600 +bytes for a 640-pixel-wide image). You may not be able to process wide +images if you have large data structures of your own. + +Of course, all of these concerns vanish if you use a 32-bit flat-memory-model +compiler, such as DJGPP or Watcom C. We highly recommend flat model if you +can use it; the JPEG library is significantly faster in flat model. diff --git a/jpeg-8c/libtool b/jpeg-8c/libtool new file mode 100755 index 00000000..5ae8d3c0 --- /dev/null +++ b/jpeg-8c/libtool @@ -0,0 +1,10062 @@ +#! /bin/bash + +# libtool - Provide generalized library-building support services. +# Generated automatically by config.status (libjpeg) 8.3.0 +# Libtool was configured on host hit: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="" + +# ### BEGIN LIBTOOL CONFIG + +# Assembler program. +AS="as" + +# DLL creation program. +DLLTOOL="dlltool" + +# Object dumper program. +OBJDUMP="objdump" + +# Which release of libtool.m4 was used? +macro_version=2.4 +macro_revision=1.3293 + +# Whether or not to build shared libraries. +build_libtool_libs=yes + +# Whether or not to build static libraries. +build_old_libs=yes + +# What type of objects to build. +pic_mode=default + +# Whether or not to optimize for fast installation. +fast_install=yes + +# Shell to use when invoking shell scripts. +SHELL="/bin/bash" + +# An echo program that protects backslashes. +ECHO="printf %s\\n" + +# The host system. +host_alias= +host=x86_64-unknown-linux-gnu +host_os=linux-gnu + +# The build system. +build_alias= +build=x86_64-unknown-linux-gnu +build_os=linux-gnu + +# A sed program that does not truncate output. +SED="/bin/sed" + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP="/bin/grep" + +# An ERE matcher. +EGREP="/bin/grep -E" + +# A literal string matcher. +FGREP="/bin/grep -F" + +# A BSD- or MS-compatible name lister. +NM="/usr/bin/nm -B" + +# Whether we need soft or hard links. +LN_S="ln -s" + +# What is the maximum length of a command? +max_cmd_len=1966080 + +# Object file suffix (normally "o"). +objext=o + +# Executable file suffix (normally ""). +exeext= + +# whether the shell understands "unset". +lt_unset=unset + +# turn spaces into newlines. +SP2NL="tr \\040 \\012" + +# turn newlines into spaces. +NL2SP="tr \\015\\012 \\040\\040" + +# convert $build file names to $host format. +to_host_file_cmd=func_convert_file_noop + +# convert $build files to toolchain format. +to_tool_file_cmd=func_convert_file_noop + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd="\$MAGIC_CMD" + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob="" + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob="no" + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd="printf %s\\n" + +# The archiver. +AR="ar" + +# Flags to create an archive. +AR_FLAGS="cru" + +# How to feed a file listing to the archiver. +archiver_list_spec="@" + +# A symbol stripping program. +STRIP="strip" + +# Commands used to install an old-style archive. +RANLIB="ranlib" +old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$oldlib" +old_postuninstall_cmds="" + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=no + +# A C compiler. +LTCC="gcc -std=gnu99" + +# LTCC compiler flags. +LTCFLAGS="-g -O2" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p' | sed '/ __gnu_lto/d'" + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl="sed -n -e 's/^T .* \\(.*\\)\$/extern int \\1();/p' -e 's/^[ABCDGIRSTW]* .* \\(.*\\)\$/extern char \\1;/p'" + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\)[ ]*\$/ {\\\"\\1\\\", (void *) 0},/p' -e 's/^[ABCDGIRSTW]* \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (void *) \\&\\2},/p'" + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \\([^ ]*\\)[ ]*\$/ {\\\"\\1\\\", (void *) 0},/p' -e 's/^[ABCDGIRSTW]* \\([^ ]*\\) \\(lib[^ ]*\\)\$/ {\"\\2\", (void *) \\&\\2},/p' -e 's/^[ABCDGIRSTW]* \\([^ ]*\\) \\([^ ]*\\)\$/ {\"lib\\2\", (void *) \\&\\2},/p'" + +# Specify filename containing input files for $NM. +nm_file_list_spec="@" + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot= + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=file + +# Must we lock files when doing compilation? +need_locks="no" + +# Manifest tool. +MANIFEST_TOOL=":" + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL="" + +# Tool to change global to local symbols on Mac OS X. +NMEDIT="" + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO="" + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL="" + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64="" + +# Old archive suffix (normally "a"). +libext=a + +# Shared library suffix (normally ".so"). +shrext_cmds=".so" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Do we need the "lib" prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Library versioning type. +version_type=linux + +# Shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# Shared library path variable. +shlibpath_var=LD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=no + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${shared_ext}\$major" + +# Permission mode override for installation of shared libraries. +install_override_mode="" + +# Command to use after installation of a shared archive. +postinstall_cmds="" + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval="" + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=yes + +# Compile-time system search path for libraries. +sys_lib_search_path_spec="/usr/lib/gcc/x86_64-linux-gnu/4.7 /usr/lib/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib " + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu " + +# Whether dlopen is supported. +dlopen_support=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Commands to strip libraries. +old_striplib="strip --strip-debug" +striplib="strip --strip-unneeded" + + +# The linker used to build libraries. +LD="/usr/bin/ld -m elf_x86_64" + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# Commands used to build an old-style archive. +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$oldlib" + +# A language specific compiler. +CC="gcc -std=gnu99" + +# Is the compiler the GNU compiler? +with_gcc=yes + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC -DPIC" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=no + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\${wl}--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object="no" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build a shared archive. +archive_cmds="\$CC -shared \$pic_flag \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~ + cat \$export_symbols | sed -e \\\"s/\\\\(.*\\\\)/\\\\1;/\\\" >> \$output_objdir/\$libname.ver~ + echo \\\"local: *; };\\\" >> \$output_objdir/\$libname.ver~ + \$CC -shared \$pic_flag \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-version-script \${wl}\$output_objdir/\$libname.ver -o \$lib" + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds="" +module_expsym_cmds="" + +# Whether we are building with GNU ld or not. +with_gnu_ld="yes" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that enforces no undefined symbols. +no_undefined_flag="" + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist +hardcode_libdir_flag_spec="\${wl}-rpath \${wl}\$libdir" + +# If ld is used when linking, flag to hardcode $libdir into a binary +# during linking. This must work even if $libdir does not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator="" + +# Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=no + +# Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting ${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=no + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=no + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=no + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=no + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=unknown + +# Set to "yes" if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*" + +# Symbols that must always be exported. +include_expsyms="" + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds="" + +# Commands necessary for finishing linking programs. +postlink_cmds="" + +# Specify filename containing input files. +file_list_spec="" + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# ### END LIBTOOL CONFIG + + +# libtool (GNU libtool) 2.4 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.4 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . +# GNU libtool home page: . +# General help using GNU software: . + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4 +TIMESTAMP="" +package_revision=1.3293 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# NLS nuisances: We save the old values to restore during execute mode. +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +$lt_unset CDPATH + + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + + + +: ${CP="cp -f"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +: ${EGREP="grep -E"} +: ${FGREP="grep -F"} +: ${GREP="grep"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SED="sed"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} # Extended-shell func_dirname implementation + + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} # Extended-shell func_basename implementation + + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} # Extended-shell func_dirname_and_basename implementation + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"} +} # Extended-shell func_stripname implementation + + +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} + +# The name of this program: +func_dirname_and_basename "$progpath" +progname=$func_basename_result + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=: + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' + +# Sed substitution that converts a w32 file name or path +# which contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + done + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "$my_tmpdir" +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "$1" | $SED \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + +# func_tr_sh +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $opt_debug + + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $opt_debug + + $SED -n '/^# Usage:/,/^# *.*--help/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + echo + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. +func_help () +{ + $opt_debug + + $SED -n '/^# Usage:/,/# Report bugs to/ { + :print + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + p + d + } + /^# .* home page:/b print + /^# General help using/b print + ' < "$progpath" + ret=$? + if test -z "$1"; then + exit $ret + fi +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $opt_debug + + func_error "missing argument for $1." + exit_cmd=exit +} + + +# func_split_short_opt shortopt +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +func_split_short_opt () +{ + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} +} # Extended-shell func_split_short_opt implementation + + +# func_split_long_opt longopt +# Set func_split_long_opt_name and func_split_long_opt_arg shell +# variables after splitting LONGOPT at the `=' sign. +func_split_long_opt () +{ + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=} +} # Extended-shell func_split_long_opt implementation + +exit_cmd=: + + + + + +magic="%%%MAGIC variable%%%" +magic_exe="%%%MAGIC EXE variable%%%" + +# Global variables. +nonopt= +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "${1}+=\${2}" +} # Extended-shell func_append implementation + +# func_append_quoted var value +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +func_append_quoted () +{ + func_quote_for_eval "${2}" + eval "${1}+=\\ \$func_quote_for_eval_result" +} # Extended-shell func_append_quoted implementation + + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $* )) +} # Extended-shell func_arith implementation + + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} # Extended-shell func_len implementation + + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} # Extended-shell func_lo2o implementation + + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} # Extended-shell func_xform implementation + + +# func_fatal_configuration arg... +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +} + + +# func_config +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + +# func_features +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + +# func_enable_tag tagname +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname="$1" + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf="/$re_begincf/,/$re_endcf/p" + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# Shorthand for --mode=foo, only valid as the first argument +case $1 in +clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; +compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; +execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; +finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; +install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; +link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; +esac + + + +# Option defaults: +opt_debug=: +opt_dry_run=false +opt_config=false +opt_preserve_dup_deps=false +opt_features=false +opt_finish=false +opt_help=false +opt_help_all=false +opt_silent=: +opt_verbose=: +opt_silent=false +opt_verbose=false + + +# Parse options once, thoroughly. This comes as soon as possible in the +# script to make things like `--version' happen as quickly as we can. +{ + # this just eases exit handling + while test $# -gt 0; do + opt="$1" + shift + case $opt in + --debug|-x) opt_debug='set -x' + func_echo "enabling shell trace mode" + $opt_debug + ;; + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + --config) + opt_config=: +func_config + ;; + --dlopen|-dlopen) + optarg="$1" + opt_dlopen="${opt_dlopen+$opt_dlopen +}$optarg" + shift + ;; + --preserve-dup-deps) + opt_preserve_dup_deps=: + ;; + --features) + opt_features=: +func_features + ;; + --finish) + opt_finish=: +set dummy --mode finish ${1+"$@"}; shift + ;; + --help) + opt_help=: + ;; + --help-all) + opt_help_all=: +opt_help=': help-all' + ;; + --mode) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_mode="$optarg" +case $optarg in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; +esac + shift + ;; + --no-silent|--no-quiet) + opt_silent=false +preserve_args+=" $opt" + ;; + --no-verbose) + opt_verbose=false +preserve_args+=" $opt" + ;; + --silent|--quiet) + opt_silent=: +preserve_args+=" $opt" + opt_verbose=false + ;; + --verbose|-v) + opt_verbose=: +preserve_args+=" $opt" +opt_silent=false + ;; + --tag) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_tag="$optarg" +preserve_args+=" $opt $optarg" +func_enable_tag "$optarg" + shift + ;; + + -\?|-h) func_usage ;; + --help) func_help ;; + --version) func_version ;; + + # Separate optargs to long options: + --*=*) + func_split_long_opt "$opt" + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-n*|-v*) + func_split_short_opt "$opt" + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognized option \`$opt'" ;; + *) set dummy "$opt" ${1+"$@"}; shift; break ;; + esac + done + + # Validate options: + + # save first non-option argument + if test "$#" -gt 0; then + nonopt="$opt" + shift + fi + + # preserve --debug + test "$opt_debug" = : || preserve_args+=" --debug" + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$opt_mode' for more information." + } + + + # Bail if the options were screwed + $exit_cmd $EXIT_FAILURE +} + + + + +## ----------- ## +## Main. ## +## ----------- ## + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case "$lt_sysroot:$1" in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result="=$func_stripname_result" + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$lt_sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $opt_debug + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result="" + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $opt_debug + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $opt_debug + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $opt_debug + if test -z "$2" && test -n "$1" ; then + func_error "Could not determine host file name corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result="$1" + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $opt_debug + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " \`$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result="$3" + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $opt_debug + case $4 in + $1 ) func_to_host_path_result="$3$func_to_host_path_result" + ;; + esac + case $4 in + $2 ) func_to_host_path_result+="$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via `$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $opt_debug + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $opt_debug + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result="$1" +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result="$func_convert_core_msys_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via `$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $opt_debug + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd="func_convert_path_${func_stripname_result}" + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $opt_debug + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result="$1" +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_mode_compile arg... +func_mode_compile () +{ + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + pie_flag+=" $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + later+=" $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + func_append_quoted lastarg "$arg" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + base_compile+=" $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj="$func_basename_result" + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from \`$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + removelist+=" $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + removelist+=" $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + command+=" -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + command+=" -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command+="$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$opt_mode'" + ;; + esac + + echo + $ECHO "Try \`$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test "$opt_help" = :; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | sed -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + sed '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + dir+="/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + libdirs+=" $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + libs+=" $opt" + else + func_warning "\`$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument \`$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || admincmds+=" + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + install_prog+="$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + files+=" $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + install_prog+=" $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + install_shared_prog+=" $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + install_shared_prog+=" -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs+=" $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs+=" $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs+=" $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + dir+="$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs+=" $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename="" + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname" ; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename="$func_basename_result" + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename" ; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) symtab_cflags+=" $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $opt_debug + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $opt_debug + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive which possess that section. Heuristic: eliminate + # all those which have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $opt_debug + if func_cygming_gnu_implib_p "$1" ; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1" ; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result="" + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ fputs ("/' -e 's/$/\\n", f);/' + + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + libtool_args+=" $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command+=" @OUTPUT@" + finalize_command+=" @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command+=" @SYMFILE@" + finalize_command+=" @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles+=" $arg" + else + dlprefiles+=" $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) deplibs+=" $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# moreargs+=" $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles+=" $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles+=" $pic_object" + prev= + fi + + # A PIC object. + libobjs+=" $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects+=" $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects+=" $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + libobjs+=" $pic_object" + non_pic_objects+=" $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath+=" $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath+=" $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + weak_libs+=" $arg" + prev= + continue + ;; + xcclinker) + linker_flags+=" $qarg" + compiler_flags+=" $qarg" + prev= + compile_command+=" $qarg" + finalize_command+=" $qarg" + continue + ;; + xcompiler) + compiler_flags+=" $qarg" + prev= + compile_command+=" $qarg" + finalize_command+=" $qarg" + continue + ;; + xlinker) + linker_flags+=" $qarg" + compiler_flags+=" $wl$qarg" + prev= + compile_command+=" $wl$qarg" + finalize_command+=" $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + compile_command+=" $link_static_flag" + finalize_command+=" $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + compile_command+=" $arg" + finalize_command+=" $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) deplibs+=" $arg" ;; + *) deplibs+=" -L$dir" ;; + esac + lib_search_path+=" $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) dllsearchpath+=":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath+=":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs+=" System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs+=" $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + compiler_flags+=" $arg" + compile_command+=" $arg" + finalize_command+=" $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags+=" $arg" + compile_command+=" $arg" + finalize_command+=" $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) new_inherited_linker_flags+=" $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath+=" $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg+=" $func_quote_for_eval_result" + compiler_flags+=" $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg+=" $wl$func_quote_for_eval_result" + compiler_flags+=" $wl$func_quote_for_eval_result" + linker_flags+=" $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + compile_command+=" $arg" + finalize_command+=" $arg" + compiler_flags+=" $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + objs+=" $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles+=" $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles+=" $pic_object" + prev= + fi + + # A PIC object. + libobjs+=" $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects+=" $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects+=" $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + libobjs+=" $pic_object" + non_pic_objects+=" $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs+=" $arg" + old_deplibs+=" $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles+=" $func_resolve_sysroot_result" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles+=" $func_resolve_sysroot_result" + prev= + else + deplibs+=" $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command+=" $arg" + finalize_command+=" $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command+=" $arg" + finalize_command+=" $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps ; then + case "$libs " in + *" $deplib "*) specialdeplibs+=" $deplib" ;; + esac + fi + libs+=" $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs+=" $pre_post_deps" ;; + esac + pre_post_deps+=" $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) deplibs+=" $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags+=" $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags+=" $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags+=" $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + newlib_search_path+=" $func_resolve_sysroot_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + newlib_search_path+=" $func_resolve_sysroot_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath+=" $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + else + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles+=" $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles+=" $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) new_inherited_linker_flags+=" $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles+=" $dlopen" + test -n "$dlpreopen" && dlprefiles+=" $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + convenience+=" $ladir/$objdir/$old_library" + old_convenience+=" $ladir/$objdir/$old_library" + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs+=" $deplib" ;; + esac + fi + tmp_libs+=" $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test "$prefer_static_libs" = yes || + test "$prefer_static_libs,$installed" = "built,no"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib="$l" + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles+=" $lib $dependency_libs" + else + newdlfiles+=" $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$lt_sysroot$libdir" + absdir="$lt_sysroot$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path+=" $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path+=" $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + case "$host" in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + newdlprefiles+=" $dir/$linklib" + else + newdlprefiles+=" $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + dlpreconveniencelibs+=" $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles+=" $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + dlpreconveniencelibs+=" $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles+=" $dir/$dlname" + else + newdlprefiles+=" $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path+=" $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + newlib_search_path+=" $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs+=" $deplib" ;; + esac + fi + tmp_libs+=" $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) temp_rpath+="$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath+=" $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath+=" $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + notinst_deplibs+=" $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + notinst_deplibs+=" $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + echo + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath+=" $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath+=" $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$opt_mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir+=" -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath+="$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath+="$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$opt_mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath+="$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir+=" -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system can not link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath+=" $temp_xrpath";; + esac;; + *) temp_deplibs+=" $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path+=" $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + specialdeplibs+=" $func_resolve_sysroot_result" ;; + esac + fi + tmp_libs+=" $func_resolve_sysroot_result" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + compiler_flags+=" ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + linker_flags+=" -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path+=" $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs+=" $deplib" ;; + esac + ;; + *) tmp_libs+=" $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs+=" $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs+="$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + libobjs+=" $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|qnx|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring+=":${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + libobjs+=" $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$opt_mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist+=" $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs+=" $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + temp_xrpath+=" -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath+=" $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles+=" $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles+=" $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs+=" System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs+=" -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs+=" $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs+=" $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs+=" $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs+=" $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs+=" $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs+=" -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs+=" $deplib" ;; + esac + ;; + *) new_libs+=" $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs+="$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath+=" $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_apped perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath+="$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + linknames+=" $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + delfiles+=" $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd1 in $cmds; do + IFS="$save_ifs" + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test "$try_normal_branch" = yes \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=${output_objdir}/${output_la}.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + delfiles+=" $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles+=" $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs+=" $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + generated+=" $gentop" + + func_extract_archives $gentop $convenience + libobjs+=" $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags+=" $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + delfiles+=" $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + delfiles+=" $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + objlist+=" $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + delfiles+=" $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles+=" $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated+=" $gentop" + + func_extract_archives $gentop $dlprefiles + libobjs+=" $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated+=" $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + compile_command+=" ${wl}-bind_at_load" + finalize_command+=" ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs+=" -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs+=" $deplib" ;; + esac + ;; + *) new_libs+=" $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command+=" $compile_deplibs" + finalize_command+=" $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath+=" $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs+="$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath+=" $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath+=" $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) dllsearchpath+=":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath+=":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs+="$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath+=" $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath+=" $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath+="$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath+="$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + oldobjs+=" $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated+=" $gentop" + + func_extract_archives $gentop $addlibs + oldobjs+=" $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated+=" $gentop" + + func_extract_archives $gentop $dlprefiles + oldobjs+=" $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + generated+=" $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + oldobjs+=" $gentop/$newobj" + ;; + *) oldobjs+=" $obj" ;; + esac + done + fi + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + objlist+=" $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + newdependency_libs+=" ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + newdependency_libs+=" -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + newdependency_libs+=" -R$func_replace_sysroot_result" + ;; + *) newdependency_libs+=" $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlfiles+=" ${lt_sysroot:+=}$libdir/$name" + ;; + *) newdlfiles+=" $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlprefiles+=" ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles+=" $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles+=" $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) RM+=" $arg"; rmforce=yes ;; + -*) RM+=" $arg" ;; + *) files+=" $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + odir="$objdir" + else + odir="$dir/$objdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$opt_mode" = uninstall && odir="$dir" + + # Remember odir for removal later, being careful to avoid duplicates + if test "$opt_mode" = clean; then + case " $rmdirs " in + *" $odir "*) ;; + *) rmdirs+=" $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles+=" $odir/$n" + done + test -n "$old_library" && rmfiles+=" $odir/$old_library" + + case "$opt_mode" in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && rmfiles+=" $odir/$dlname" ;; + esac + test -n "$libdir" && rmfiles+=" $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + rmfiles+=" $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + rmfiles+=" $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$opt_mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles+=" $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + rmfiles+=" $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles+=" $odir/$name $odir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles+=" $odir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles+=" $odir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$opt_mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/jpeg-8c/ltmain.sh b/jpeg-8c/ltmain.sh new file mode 100755 index 00000000..3061e3c5 --- /dev/null +++ b/jpeg-8c/ltmain.sh @@ -0,0 +1,9636 @@ + +# libtool (GNU libtool) 2.4 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.4 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . +# GNU libtool home page: . +# General help using GNU software: . + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4 +TIMESTAMP="" +package_revision=1.3293 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# NLS nuisances: We save the old values to restore during execute mode. +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +$lt_unset CDPATH + + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + + + +: ${CP="cp -f"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +: ${EGREP="grep -E"} +: ${FGREP="grep -F"} +: ${GREP="grep"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SED="sed"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} # func_dirname may be replaced by extended shell implementation + + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "${1}" | $SED "$basename"` +} # func_basename may be replaced by extended shell implementation + + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` +} # func_dirname_and_basename may be replaced by extended shell implementation + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname may be replaced by extended shell implementation + + +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} + +# The name of this program: +func_dirname_and_basename "$progpath" +progname=$func_basename_result + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=: + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' + +# Sed substitution that converts a w32 file name or path +# which contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + done + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "$my_tmpdir" +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "$1" | $SED \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + +# func_tr_sh +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $opt_debug + + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $opt_debug + + $SED -n '/^# Usage:/,/^# *.*--help/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + echo + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. +func_help () +{ + $opt_debug + + $SED -n '/^# Usage:/,/# Report bugs to/ { + :print + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + p + d + } + /^# .* home page:/b print + /^# General help using/b print + ' < "$progpath" + ret=$? + if test -z "$1"; then + exit $ret + fi +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $opt_debug + + func_error "missing argument for $1." + exit_cmd=exit +} + + +# func_split_short_opt shortopt +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +func_split_short_opt () +{ + my_sed_short_opt='1s/^\(..\).*$/\1/;q' + my_sed_short_rest='1s/^..\(.*\)$/\1/;q' + + func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` + func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` +} # func_split_short_opt may be replaced by extended shell implementation + + +# func_split_long_opt longopt +# Set func_split_long_opt_name and func_split_long_opt_arg shell +# variables after splitting LONGOPT at the `=' sign. +func_split_long_opt () +{ + my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' + my_sed_long_arg='1s/^--[^=]*=//' + + func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` + func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` +} # func_split_long_opt may be replaced by extended shell implementation + +exit_cmd=: + + + + + +magic="%%%MAGIC variable%%%" +magic_exe="%%%MAGIC EXE variable%%%" + +# Global variables. +nonopt= +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "${1}=\$${1}\${2}" +} # func_append may be replaced by extended shell implementation + +# func_append_quoted var value +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +func_append_quoted () +{ + func_quote_for_eval "${2}" + eval "${1}=\$${1}\\ \$func_quote_for_eval_result" +} # func_append_quoted may be replaced by extended shell implementation + + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "${@}"` +} # func_arith may be replaced by extended shell implementation + + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` +} # func_len may be replaced by extended shell implementation + + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` +} # func_lo2o may be replaced by extended shell implementation + + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` +} # func_xform may be replaced by extended shell implementation + + +# func_fatal_configuration arg... +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +} + + +# func_config +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + +# func_features +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + +# func_enable_tag tagname +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname="$1" + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf="/$re_begincf/,/$re_endcf/p" + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# Shorthand for --mode=foo, only valid as the first argument +case $1 in +clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; +compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; +execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; +finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; +install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; +link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; +esac + + + +# Option defaults: +opt_debug=: +opt_dry_run=false +opt_config=false +opt_preserve_dup_deps=false +opt_features=false +opt_finish=false +opt_help=false +opt_help_all=false +opt_silent=: +opt_verbose=: +opt_silent=false +opt_verbose=false + + +# Parse options once, thoroughly. This comes as soon as possible in the +# script to make things like `--version' happen as quickly as we can. +{ + # this just eases exit handling + while test $# -gt 0; do + opt="$1" + shift + case $opt in + --debug|-x) opt_debug='set -x' + func_echo "enabling shell trace mode" + $opt_debug + ;; + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + --config) + opt_config=: +func_config + ;; + --dlopen|-dlopen) + optarg="$1" + opt_dlopen="${opt_dlopen+$opt_dlopen +}$optarg" + shift + ;; + --preserve-dup-deps) + opt_preserve_dup_deps=: + ;; + --features) + opt_features=: +func_features + ;; + --finish) + opt_finish=: +set dummy --mode finish ${1+"$@"}; shift + ;; + --help) + opt_help=: + ;; + --help-all) + opt_help_all=: +opt_help=': help-all' + ;; + --mode) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_mode="$optarg" +case $optarg in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; +esac + shift + ;; + --no-silent|--no-quiet) + opt_silent=false +func_append preserve_args " $opt" + ;; + --no-verbose) + opt_verbose=false +func_append preserve_args " $opt" + ;; + --silent|--quiet) + opt_silent=: +func_append preserve_args " $opt" + opt_verbose=false + ;; + --verbose|-v) + opt_verbose=: +func_append preserve_args " $opt" +opt_silent=false + ;; + --tag) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_tag="$optarg" +func_append preserve_args " $opt $optarg" +func_enable_tag "$optarg" + shift + ;; + + -\?|-h) func_usage ;; + --help) func_help ;; + --version) func_version ;; + + # Separate optargs to long options: + --*=*) + func_split_long_opt "$opt" + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-n*|-v*) + func_split_short_opt "$opt" + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognized option \`$opt'" ;; + *) set dummy "$opt" ${1+"$@"}; shift; break ;; + esac + done + + # Validate options: + + # save first non-option argument + if test "$#" -gt 0; then + nonopt="$opt" + shift + fi + + # preserve --debug + test "$opt_debug" = : || func_append preserve_args " --debug" + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$opt_mode' for more information." + } + + + # Bail if the options were screwed + $exit_cmd $EXIT_FAILURE +} + + + + +## ----------- ## +## Main. ## +## ----------- ## + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case "$lt_sysroot:$1" in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result="=$func_stripname_result" + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$lt_sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $opt_debug + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result="" + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $opt_debug + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $opt_debug + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $opt_debug + if test -z "$2" && test -n "$1" ; then + func_error "Could not determine host file name corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result="$1" + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $opt_debug + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " \`$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result="$3" + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $opt_debug + case $4 in + $1 ) func_to_host_path_result="$3$func_to_host_path_result" + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via `$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $opt_debug + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $opt_debug + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result="$1" +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result="$func_convert_core_msys_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via `$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $opt_debug + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd="func_convert_path_${func_stripname_result}" + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $opt_debug + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result="$1" +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_mode_compile arg... +func_mode_compile () +{ + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + func_append_quoted lastarg "$arg" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj="$func_basename_result" + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from \`$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$opt_mode'" + ;; + esac + + echo + $ECHO "Try \`$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test "$opt_help" = :; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | sed -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + sed '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "\`$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument \`$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename="" + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname" ; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename="$func_basename_result" + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename" ; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $opt_debug + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $opt_debug + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive which possess that section. Heuristic: eliminate + # all those which have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $opt_debug + if func_cygming_gnu_implib_p "$1" ; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1" ; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result="" + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ fputs ("/' -e 's/$/\\n", f);/' + + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps ; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + else + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test "$prefer_static_libs" = yes || + test "$prefer_static_libs,$installed" = "built,no"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib="$l" + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$lt_sysroot$libdir" + absdir="$lt_sysroot$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + case "$host" in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + echo + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$opt_mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$opt_mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system can not link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|qnx|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + func_append verstring ":${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + func_append libobjs " $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$opt_mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_apped perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd1 in $cmds; do + IFS="$save_ifs" + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test "$try_normal_branch" = yes \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=${output_objdir}/${output_la}.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " ${wl}-bind_at_load" + func_append finalize_command " ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + func_append oldobjs " $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=yes ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + odir="$objdir" + else + odir="$dir/$objdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$opt_mode" = uninstall && odir="$dir" + + # Remember odir for removal later, being careful to avoid duplicates + if test "$opt_mode" = clean; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case "$opt_mode" in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$opt_mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + func_append rmfiles " $odir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$opt_mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/jpeg-8c/makcjpeg.st b/jpeg-8c/makcjpeg.st new file mode 100644 index 00000000..628f5335 --- /dev/null +++ b/jpeg-8c/makcjpeg.st @@ -0,0 +1,36 @@ +; Project file for Independent JPEG Group's software +; +; This project file is for Atari ST/STE/TT systems using Pure C or Turbo C. +; Thanks to Frank Moehle, B. Setzepfandt, and Guido Vollbeding. +; +; To use this file, rename it to cjpeg.prj. +; If you are using Turbo C, change filenames beginning with "pc..." to "tc..." +; Read installation instructions before trying to make the program! +; +; +; * * * Output file * * * +cjpeg.ttp +; +; * * * COMPILER OPTIONS * * * +.C[-P] ; absolute calls +.C[-M] ; and no string merging, folks +.C[-w-cln] ; no "constant is long" warnings +.C[-w-par] ; no "parameter xxxx unused" +.C[-w-rch] ; no "unreachable code" +.C[-wsig] ; warn if significant digits may be lost += +; * * * * List of modules * * * * +pcstart.o +cjpeg.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h,jversion.h) +cdjpeg.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +rdswitch.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +rdppm.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +rdgif.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +rdtarga.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +rdbmp.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +rdrle.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +libjpeg.lib ; built by libjpeg.prj +pcfltlib.lib ; floating point library +; the float library can be omitted if you've turned off DCT_FLOAT_SUPPORTED +pcstdlib.lib ; standard library +pcextlib.lib ; extended library diff --git a/jpeg-8c/makdjpeg.st b/jpeg-8c/makdjpeg.st new file mode 100644 index 00000000..4b61404a --- /dev/null +++ b/jpeg-8c/makdjpeg.st @@ -0,0 +1,36 @@ +; Project file for Independent JPEG Group's software +; +; This project file is for Atari ST/STE/TT systems using Pure C or Turbo C. +; Thanks to Frank Moehle, B. Setzepfandt, and Guido Vollbeding. +; +; To use this file, rename it to djpeg.prj. +; If you are using Turbo C, change filenames beginning with "pc..." to "tc..." +; Read installation instructions before trying to make the program! +; +; +; * * * Output file * * * +djpeg.ttp +; +; * * * COMPILER OPTIONS * * * +.C[-P] ; absolute calls +.C[-M] ; and no string merging, folks +.C[-w-cln] ; no "constant is long" warnings +.C[-w-par] ; no "parameter xxxx unused" +.C[-w-rch] ; no "unreachable code" +.C[-wsig] ; warn if significant digits may be lost += +; * * * * List of modules * * * * +pcstart.o +djpeg.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h,jversion.h) +cdjpeg.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +rdcolmap.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +wrppm.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +wrgif.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +wrtarga.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +wrbmp.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +wrrle.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +libjpeg.lib ; built by libjpeg.prj +pcfltlib.lib ; floating point library +; the float library can be omitted if you've turned off DCT_FLOAT_SUPPORTED +pcstdlib.lib ; standard library +pcextlib.lib ; extended library diff --git a/jpeg-8c/makeadsw.vc6 b/jpeg-8c/makeadsw.vc6 new file mode 100644 index 00000000..80459c53 --- /dev/null +++ b/jpeg-8c/makeadsw.vc6 @@ -0,0 +1,77 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELSCHT WERDEN! + +############################################################################### + +Project: "cjpeg"=".\cjpeg.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "djpeg"=".\djpeg.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "jpegtran"=".\jpegtran.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "rdjpgcom"=".\rdjpgcom.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "wrjpgcom"=".\wrjpgcom.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/jpeg-8c/makeasln.v10 b/jpeg-8c/makeasln.v10 new file mode 100644 index 00000000..617d9e94 --- /dev/null +++ b/jpeg-8c/makeasln.v10 @@ -0,0 +1,33 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual C++ Express 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cjpeg", "cjpeg.vcxproj", "{2E7FAAD9-2F58-4BDE-81F2-1D6D3FB8BF57}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "djpeg", "djpeg.vcxproj", "{11043137-B453-4DFA-9010-4D2B9DC1545C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpegtran", "jpegtran.vcxproj", "{025BAC50-51B5-4FFE-BC47-3F920BB4047E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rdjpgcom", "rdjpgcom.vcxproj", "{C81513DB-78DC-46BC-BC98-82E745203976}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wrjpgcom", "wrjpgcom.vcxproj", "{B57065D4-DDDA-4668-BAF5-2D49270C973C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2E7FAAD9-2F58-4BDE-81F2-1D6D3FB8BF57}.Release|Win32.ActiveCfg = Release|Win32 + {2E7FAAD9-2F58-4BDE-81F2-1D6D3FB8BF57}.Release|Win32.Build.0 = Release|Win32 + {11043137-B453-4DFA-9010-4D2B9DC1545C}.Release|Win32.ActiveCfg = Release|Win32 + {11043137-B453-4DFA-9010-4D2B9DC1545C}.Release|Win32.Build.0 = Release|Win32 + {025BAC50-51B5-4FFE-BC47-3F920BB4047E}.Release|Win32.ActiveCfg = Release|Win32 + {025BAC50-51B5-4FFE-BC47-3F920BB4047E}.Release|Win32.Build.0 = Release|Win32 + {C81513DB-78DC-46BC-BC98-82E745203976}.Release|Win32.ActiveCfg = Release|Win32 + {C81513DB-78DC-46BC-BC98-82E745203976}.Release|Win32.Build.0 = Release|Win32 + {B57065D4-DDDA-4668-BAF5-2D49270C973C}.Release|Win32.ActiveCfg = Release|Win32 + {B57065D4-DDDA-4668-BAF5-2D49270C973C}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/jpeg-8c/makecdep.vc6 b/jpeg-8c/makecdep.vc6 new file mode 100644 index 00000000..11dff777 --- /dev/null +++ b/jpeg-8c/makecdep.vc6 @@ -0,0 +1,82 @@ +# Microsoft Developer Studio erstellte Abhngigkeitsdatei, einbezogen von cjpeg.mak + +.\cdjpeg.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\cjpeg.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + ".\jversion.h"\ + + +.\rdbmp.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\rdgif.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\rdppm.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\rdrle.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\rdswitch.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\rdtarga.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + diff --git a/jpeg-8c/makecdsp.vc6 b/jpeg-8c/makecdsp.vc6 new file mode 100644 index 00000000..3ab59651 --- /dev/null +++ b/jpeg-8c/makecdsp.vc6 @@ -0,0 +1,130 @@ +# Microsoft Developer Studio Project File - Name="cjpeg" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** NICHT BEARBEITEN ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=cjpeg - Win32 +!MESSAGE Dies ist kein gltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE +!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und fhren Sie den Befehl +!MESSAGE +!MESSAGE NMAKE /f "cjpeg.mak". +!MESSAGE +!MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben +!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: +!MESSAGE +!MESSAGE NMAKE /f "cjpeg.mak" CFG="cjpeg - Win32" +!MESSAGE +!MESSAGE Fr die Konfiguration stehen zur Auswahl: +!MESSAGE +!MESSAGE "cjpeg - Win32" (basierend auf "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir ".\cjpeg\Release" +# PROP BASE Intermediate_Dir ".\cjpeg\Release" +# PROP BASE Target_Dir ".\cjpeg" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir ".\cjpeg\Release" +# PROP Intermediate_Dir ".\cjpeg\Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir ".\cjpeg" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c +# ADD CPP /nologo /G6 /MT /W3 /GX /Ox /Oa /Ob2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 Release\jpeg.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# Begin Target + +# Name "cjpeg - Win32" +# Begin Group "Quellcodedateien" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\cdjpeg.c +# End Source File +# Begin Source File + +SOURCE=.\cjpeg.c +# End Source File +# Begin Source File + +SOURCE=.\rdbmp.c +# End Source File +# Begin Source File + +SOURCE=.\rdgif.c +# End Source File +# Begin Source File + +SOURCE=.\rdppm.c +# End Source File +# Begin Source File + +SOURCE=.\rdrle.c +# End Source File +# Begin Source File + +SOURCE=.\rdswitch.c +# End Source File +# Begin Source File + +SOURCE=.\rdtarga.c +# End Source File +# End Group +# Begin Group "Header-Dateien" + +# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" +# Begin Source File + +SOURCE=.\cderror.h +# End Source File +# Begin Source File + +SOURCE=.\cdjpeg.h +# End Source File +# Begin Source File + +SOURCE=.\jconfig.h +# End Source File +# Begin Source File + +SOURCE=.\jerror.h +# End Source File +# Begin Source File + +SOURCE=.\jinclude.h +# End Source File +# Begin Source File + +SOURCE=.\jmorecfg.h +# End Source File +# Begin Source File + +SOURCE=.\jpeglib.h +# End Source File +# Begin Source File + +SOURCE=.\jversion.h +# End Source File +# End Group +# Begin Group "Ressourcendateien" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/jpeg-8c/makecfil.v10 b/jpeg-8c/makecfil.v10 new file mode 100644 index 00000000..a4f81ac3 --- /dev/null +++ b/jpeg-8c/makecfil.v10 @@ -0,0 +1,69 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/jpeg-8c/makecmak.vc6 b/jpeg-8c/makecmak.vc6 new file mode 100644 index 00000000..bee03bf9 --- /dev/null +++ b/jpeg-8c/makecmak.vc6 @@ -0,0 +1,159 @@ +# Microsoft Developer Studio Generated NMAKE File, Based on cjpeg.dsp +!IF "$(CFG)" == "" +CFG=cjpeg - Win32 +!MESSAGE Keine Konfiguration angegeben. cjpeg - Win32 wird als Standard verwendet. +!ENDIF + +!IF "$(CFG)" != "cjpeg - Win32" +!MESSAGE Ungltige Konfiguration "$(CFG)" angegeben. +!MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben +!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: +!MESSAGE +!MESSAGE NMAKE /f "cjpeg.mak" CFG="cjpeg - Win32" +!MESSAGE +!MESSAGE Fr die Konfiguration stehen zur Auswahl: +!MESSAGE +!MESSAGE "cjpeg - Win32" (basierend auf "Win32 (x86) Console Application") +!MESSAGE +!ERROR Eine ungltige Konfiguration wurde angegeben. +!ENDIF + +!IF "$(OS)" == "Windows_NT" +NULL= +!ELSE +NULL=nul +!ENDIF + +CPP=cl.exe +RSC=rc.exe +OUTDIR=.\cjpeg\Release +INTDIR=.\cjpeg\Release +# Begin Custom Macros +OutDir=.\cjpeg\Release +# End Custom Macros + +ALL : "$(OUTDIR)\cjpeg.exe" + + +CLEAN : + -@erase "$(INTDIR)\cdjpeg.obj" + -@erase "$(INTDIR)\cjpeg.obj" + -@erase "$(INTDIR)\rdbmp.obj" + -@erase "$(INTDIR)\rdgif.obj" + -@erase "$(INTDIR)\rdppm.obj" + -@erase "$(INTDIR)\rdrle.obj" + -@erase "$(INTDIR)\rdswitch.obj" + -@erase "$(INTDIR)\rdtarga.obj" + -@erase "$(INTDIR)\vc60.idb" + -@erase "$(OUTDIR)\cjpeg.exe" + +"$(OUTDIR)" : + if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + +BSC32=bscmake.exe +BSC32_FLAGS=/nologo /o"$(OUTDIR)\cjpeg.bsc" +BSC32_SBRS= \ + +LINK32=link.exe +LINK32_FLAGS=Release\jpeg.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\cjpeg.pdb" /machine:I386 /out:"$(OUTDIR)\cjpeg.exe" +LINK32_OBJS= \ + "$(INTDIR)\cdjpeg.obj" \ + "$(INTDIR)\cjpeg.obj" \ + "$(INTDIR)\rdbmp.obj" \ + "$(INTDIR)\rdgif.obj" \ + "$(INTDIR)\rdppm.obj" \ + "$(INTDIR)\rdrle.obj" \ + "$(INTDIR)\rdswitch.obj" \ + "$(INTDIR)\rdtarga.obj" + +"$(OUTDIR)\cjpeg.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) + $(LINK32) @<< + $(LINK32_FLAGS) $(LINK32_OBJS) +<< + +CPP_PROJ=/nologo /G6 /MT /W3 /GX /Ox /Oa /Ob2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /Fp"$(INTDIR)\cjpeg.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c + +.c{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.c{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + + +!IF "$(NO_EXTERNAL_DEPS)" != "1" +!IF EXISTS("cjpeg.dep") +!INCLUDE "cjpeg.dep" +!ELSE +!MESSAGE Warning: cannot find "cjpeg.dep" +!ENDIF +!ENDIF + + +!IF "$(CFG)" == "cjpeg - Win32" +SOURCE=.\cdjpeg.c + +"$(INTDIR)\cdjpeg.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\cjpeg.c + +"$(INTDIR)\cjpeg.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\rdbmp.c + +"$(INTDIR)\rdbmp.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\rdgif.c + +"$(INTDIR)\rdgif.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\rdppm.c + +"$(INTDIR)\rdppm.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\rdrle.c + +"$(INTDIR)\rdrle.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\rdswitch.c + +"$(INTDIR)\rdswitch.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\rdtarga.c + +"$(INTDIR)\rdtarga.obj" : $(SOURCE) "$(INTDIR)" + + + +!ENDIF + diff --git a/jpeg-8c/makecvcx.v10 b/jpeg-8c/makecvcx.v10 new file mode 100644 index 00000000..5df5c68f --- /dev/null +++ b/jpeg-8c/makecvcx.v10 @@ -0,0 +1,76 @@ + + + + + Release + Win32 + + + + {2E7FAAD9-2F58-4BDE-81F2-1D6D3FB8BF57} + Win32Proj + cjpeg + + + + Application + false + true + Unicode + + + + + + + + + + false + $(ProjectName)\$(Configuration)\ + $(ProjectName)\$(Configuration)\ + + + + Level3 + NotUsing + Full + true + false + WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS + true + true + 4996 + + + Console + true + true + true + Release\jpeg.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jpeg-8c/makeddep.vc6 b/jpeg-8c/makeddep.vc6 new file mode 100644 index 00000000..f911eba7 --- /dev/null +++ b/jpeg-8c/makeddep.vc6 @@ -0,0 +1,82 @@ +# Microsoft Developer Studio erstellte Abhngigkeitsdatei, einbezogen von djpeg.mak + +.\cdjpeg.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\djpeg.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + ".\jversion.h"\ + + +.\rdcolmap.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\wrbmp.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\wrgif.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\wrppm.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\wrrle.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\wrtarga.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + diff --git a/jpeg-8c/makeddsp.vc6 b/jpeg-8c/makeddsp.vc6 new file mode 100644 index 00000000..f583a0f6 --- /dev/null +++ b/jpeg-8c/makeddsp.vc6 @@ -0,0 +1,130 @@ +# Microsoft Developer Studio Project File - Name="djpeg" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** NICHT BEARBEITEN ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=djpeg - Win32 +!MESSAGE Dies ist kein gltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE +!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und fhren Sie den Befehl +!MESSAGE +!MESSAGE NMAKE /f "djpeg.mak". +!MESSAGE +!MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben +!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: +!MESSAGE +!MESSAGE NMAKE /f "djpeg.mak" CFG="djpeg - Win32" +!MESSAGE +!MESSAGE Fr die Konfiguration stehen zur Auswahl: +!MESSAGE +!MESSAGE "djpeg - Win32" (basierend auf "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir ".\djpeg\Release" +# PROP BASE Intermediate_Dir ".\djpeg\Release" +# PROP BASE Target_Dir ".\djpeg" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir ".\djpeg\Release" +# PROP Intermediate_Dir ".\djpeg\Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir ".\djpeg" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c +# ADD CPP /nologo /G6 /MT /W3 /GX /Ox /Oa /Ob2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 Release\jpeg.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# Begin Target + +# Name "djpeg - Win32" +# Begin Group "Quellcodedateien" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\cdjpeg.c +# End Source File +# Begin Source File + +SOURCE=.\djpeg.c +# End Source File +# Begin Source File + +SOURCE=.\rdcolmap.c +# End Source File +# Begin Source File + +SOURCE=.\wrbmp.c +# End Source File +# Begin Source File + +SOURCE=.\wrgif.c +# End Source File +# Begin Source File + +SOURCE=.\wrppm.c +# End Source File +# Begin Source File + +SOURCE=.\wrrle.c +# End Source File +# Begin Source File + +SOURCE=.\wrtarga.c +# End Source File +# End Group +# Begin Group "Header-Dateien" + +# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" +# Begin Source File + +SOURCE=.\cderror.h +# End Source File +# Begin Source File + +SOURCE=.\cdjpeg.h +# End Source File +# Begin Source File + +SOURCE=.\jconfig.h +# End Source File +# Begin Source File + +SOURCE=.\jerror.h +# End Source File +# Begin Source File + +SOURCE=.\jinclude.h +# End Source File +# Begin Source File + +SOURCE=.\jmorecfg.h +# End Source File +# Begin Source File + +SOURCE=.\jpeglib.h +# End Source File +# Begin Source File + +SOURCE=.\jversion.h +# End Source File +# End Group +# Begin Group "Ressourcendateien" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/jpeg-8c/makedfil.v10 b/jpeg-8c/makedfil.v10 new file mode 100644 index 00000000..b4a83abf --- /dev/null +++ b/jpeg-8c/makedfil.v10 @@ -0,0 +1,69 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/jpeg-8c/makedmak.vc6 b/jpeg-8c/makedmak.vc6 new file mode 100644 index 00000000..e16487ff --- /dev/null +++ b/jpeg-8c/makedmak.vc6 @@ -0,0 +1,159 @@ +# Microsoft Developer Studio Generated NMAKE File, Based on djpeg.dsp +!IF "$(CFG)" == "" +CFG=djpeg - Win32 +!MESSAGE Keine Konfiguration angegeben. djpeg - Win32 wird als Standard verwendet. +!ENDIF + +!IF "$(CFG)" != "djpeg - Win32" +!MESSAGE Ungltige Konfiguration "$(CFG)" angegeben. +!MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben +!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: +!MESSAGE +!MESSAGE NMAKE /f "djpeg.mak" CFG="djpeg - Win32" +!MESSAGE +!MESSAGE Fr die Konfiguration stehen zur Auswahl: +!MESSAGE +!MESSAGE "djpeg - Win32" (basierend auf "Win32 (x86) Console Application") +!MESSAGE +!ERROR Eine ungltige Konfiguration wurde angegeben. +!ENDIF + +!IF "$(OS)" == "Windows_NT" +NULL= +!ELSE +NULL=nul +!ENDIF + +CPP=cl.exe +RSC=rc.exe +OUTDIR=.\djpeg\Release +INTDIR=.\djpeg\Release +# Begin Custom Macros +OutDir=.\djpeg\Release +# End Custom Macros + +ALL : "$(OUTDIR)\djpeg.exe" + + +CLEAN : + -@erase "$(INTDIR)\cdjpeg.obj" + -@erase "$(INTDIR)\djpeg.obj" + -@erase "$(INTDIR)\rdcolmap.obj" + -@erase "$(INTDIR)\vc60.idb" + -@erase "$(INTDIR)\wrbmp.obj" + -@erase "$(INTDIR)\wrgif.obj" + -@erase "$(INTDIR)\wrppm.obj" + -@erase "$(INTDIR)\wrrle.obj" + -@erase "$(INTDIR)\wrtarga.obj" + -@erase "$(OUTDIR)\djpeg.exe" + +"$(OUTDIR)" : + if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + +BSC32=bscmake.exe +BSC32_FLAGS=/nologo /o"$(OUTDIR)\djpeg.bsc" +BSC32_SBRS= \ + +LINK32=link.exe +LINK32_FLAGS=Release\jpeg.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\djpeg.pdb" /machine:I386 /out:"$(OUTDIR)\djpeg.exe" +LINK32_OBJS= \ + "$(INTDIR)\cdjpeg.obj" \ + "$(INTDIR)\djpeg.obj" \ + "$(INTDIR)\rdcolmap.obj" \ + "$(INTDIR)\wrbmp.obj" \ + "$(INTDIR)\wrgif.obj" \ + "$(INTDIR)\wrppm.obj" \ + "$(INTDIR)\wrrle.obj" \ + "$(INTDIR)\wrtarga.obj" + +"$(OUTDIR)\djpeg.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) + $(LINK32) @<< + $(LINK32_FLAGS) $(LINK32_OBJS) +<< + +CPP_PROJ=/nologo /G6 /MT /W3 /GX /Ox /Oa /Ob2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /Fp"$(INTDIR)\djpeg.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c + +.c{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.c{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + + +!IF "$(NO_EXTERNAL_DEPS)" != "1" +!IF EXISTS("djpeg.dep") +!INCLUDE "djpeg.dep" +!ELSE +!MESSAGE Warning: cannot find "djpeg.dep" +!ENDIF +!ENDIF + + +!IF "$(CFG)" == "djpeg - Win32" +SOURCE=.\cdjpeg.c + +"$(INTDIR)\cdjpeg.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\djpeg.c + +"$(INTDIR)\djpeg.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\rdcolmap.c + +"$(INTDIR)\rdcolmap.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\wrbmp.c + +"$(INTDIR)\wrbmp.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\wrgif.c + +"$(INTDIR)\wrgif.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\wrppm.c + +"$(INTDIR)\wrppm.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\wrrle.c + +"$(INTDIR)\wrrle.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\wrtarga.c + +"$(INTDIR)\wrtarga.obj" : $(SOURCE) "$(INTDIR)" + + + +!ENDIF + diff --git a/jpeg-8c/makedvcx.v10 b/jpeg-8c/makedvcx.v10 new file mode 100644 index 00000000..9ad2d413 --- /dev/null +++ b/jpeg-8c/makedvcx.v10 @@ -0,0 +1,76 @@ + + + + + Release + Win32 + + + + {11043137-B453-4DFA-9010-4D2B9DC1545C} + Win32Proj + djpeg + + + + Application + false + true + Unicode + + + + + + + + + + false + $(ProjectName)\$(Configuration)\ + $(ProjectName)\$(Configuration)\ + + + + Level3 + NotUsing + Full + true + false + WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS + true + true + 4996 + + + Console + true + true + true + Release\jpeg.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jpeg-8c/makefile.ansi b/jpeg-8c/makefile.ansi new file mode 100644 index 00000000..7d0499f8 --- /dev/null +++ b/jpeg-8c/makefile.ansi @@ -0,0 +1,221 @@ +# Makefile for Independent JPEG Group's software + +# This makefile is suitable for Unix-like systems with ANSI-capable compilers. +# If you have a non-ANSI compiler, makefile.unix is a better starting point. + +# Read installation instructions before saying "make" !! + +# The name of your C compiler: +CC= cc + +# You may need to adjust these cc options: +CFLAGS= -O +# Generally, we recommend defining any configuration symbols in jconfig.h, +# NOT via -D switches here. + +# Link-time cc options: +LDFLAGS= + +# To link any special libraries, add the necessary -l commands here. +LDLIBS= + +# Put here the object file name for the correct system-dependent memory +# manager file. For Unix this is usually jmemnobs.o, but you may want +# to use jmemansi.o or jmemname.o if you have limited swap space. +SYSDEPMEM= jmemnobs.o + +# miscellaneous OS-dependent stuff +# linker +LN= $(CC) +# file deletion command +RM= rm -f +# library (.a) file creation command +AR= ar rc +# second step in .a creation (use "touch" if not needed) +AR2= ranlib + +# End of configurable options. + + +# source files: JPEG library proper +LIBSOURCES= jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \ + jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \ + jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \ + jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \ + jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \ + jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \ + jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \ + jquant2.c jutils.c jmemmgr.c +# memmgr back ends: compile only one of these into a working library +SYSDEPSOURCES= jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c +# source files: cjpeg/djpeg/jpegtran applications, also rdjpgcom/wrjpgcom +APPSOURCES= cjpeg.c djpeg.c jpegtran.c rdjpgcom.c wrjpgcom.c cdjpeg.c \ + rdcolmap.c rdswitch.c transupp.c rdppm.c wrppm.c rdgif.c wrgif.c \ + rdtarga.c wrtarga.c rdbmp.c wrbmp.c rdrle.c wrrle.c +SOURCES= $(LIBSOURCES) $(SYSDEPSOURCES) $(APPSOURCES) +# files included by source files +INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \ + jpeglib.h jversion.h cdjpeg.h cderror.h transupp.h +# documentation, test, and support files +DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \ + wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \ + coderules.txt filelist.txt change.log +MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \ + makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \ + makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ + makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ + maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ + makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \ + makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \ + makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \ + makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \ + makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \ + makefile.mms makefile.vms makvms.opt +CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ + jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ + jconfig.vms +CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing +OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \ + libjpeg.map +TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \ + testimgp.jpg +DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \ + $(CONFIGUREFILES) $(OTHERFILES) $(TESTFILES) +# library object files common to compression and decompression +COMOBJECTS= jaricom.o jcomapi.o jutils.o jerror.o jmemmgr.o $(SYSDEPMEM) +# compression library object files +CLIBOBJECTS= jcapimin.o jcapistd.o jcarith.o jctrans.o jcparam.o \ + jdatadst.o jcinit.o jcmaster.o jcmarker.o jcmainct.o jcprepct.o \ + jccoefct.o jccolor.o jcsample.o jchuff.o jcdctmgr.o jfdctfst.o \ + jfdctflt.o jfdctint.o +# decompression library object files +DLIBOBJECTS= jdapimin.o jdapistd.o jdarith.o jdtrans.o jdatasrc.o \ + jdmaster.o jdinput.o jdmarker.o jdhuff.o jdmainct.o \ + jdcoefct.o jdpostct.o jddctmgr.o jidctfst.o jidctflt.o \ + jidctint.o jdsample.o jdcolor.o jquant1.o jquant2.o jdmerge.o +# These objectfiles are included in libjpeg.a +LIBOBJECTS= $(CLIBOBJECTS) $(DLIBOBJECTS) $(COMOBJECTS) +# object files for sample applications (excluding library files) +COBJECTS= cjpeg.o rdppm.o rdgif.o rdtarga.o rdrle.o rdbmp.o rdswitch.o \ + cdjpeg.o +DOBJECTS= djpeg.o wrppm.o wrgif.o wrtarga.o wrrle.o wrbmp.o rdcolmap.o \ + cdjpeg.o +TROBJECTS= jpegtran.o rdswitch.o cdjpeg.o transupp.o + + +all: libjpeg.a cjpeg djpeg jpegtran rdjpgcom wrjpgcom + +libjpeg.a: $(LIBOBJECTS) + $(RM) libjpeg.a + $(AR) libjpeg.a $(LIBOBJECTS) + $(AR2) libjpeg.a + +cjpeg: $(COBJECTS) libjpeg.a + $(LN) $(LDFLAGS) -o cjpeg $(COBJECTS) libjpeg.a $(LDLIBS) + +djpeg: $(DOBJECTS) libjpeg.a + $(LN) $(LDFLAGS) -o djpeg $(DOBJECTS) libjpeg.a $(LDLIBS) + +jpegtran: $(TROBJECTS) libjpeg.a + $(LN) $(LDFLAGS) -o jpegtran $(TROBJECTS) libjpeg.a $(LDLIBS) + +rdjpgcom: rdjpgcom.o + $(LN) $(LDFLAGS) -o rdjpgcom rdjpgcom.o $(LDLIBS) + +wrjpgcom: wrjpgcom.o + $(LN) $(LDFLAGS) -o wrjpgcom wrjpgcom.o $(LDLIBS) + +jconfig.h: jconfig.txt + echo You must prepare a system-dependent jconfig.h file. + echo Please read the installation directions in install.txt. + exit 1 + +clean: + $(RM) *.o cjpeg djpeg jpegtran libjpeg.a rdjpgcom wrjpgcom + $(RM) core testout* + +test: cjpeg djpeg jpegtran + $(RM) testout* + ./djpeg -dct int -ppm -outfile testout.ppm testorig.jpg + ./djpeg -dct int -bmp -colors 256 -outfile testout.bmp testorig.jpg + ./cjpeg -dct int -outfile testout.jpg testimg.ppm + ./djpeg -dct int -ppm -outfile testoutp.ppm testprog.jpg + ./cjpeg -dct int -progressive -opt -outfile testoutp.jpg testimg.ppm + ./jpegtran -outfile testoutt.jpg testprog.jpg + cmp testimg.ppm testout.ppm + cmp testimg.bmp testout.bmp + cmp testimg.jpg testout.jpg + cmp testimg.ppm testoutp.ppm + cmp testimgp.jpg testoutp.jpg + cmp testorig.jpg testoutt.jpg + + +jaricom.o: jaricom.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapimin.o: jcapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapistd.o: jcapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcarith.o: jcarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccoefct.o: jccoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccolor.o: jccolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcdctmgr.o: jcdctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jchuff.o: jchuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcinit.o: jcinit.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmainct.o: jcmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmarker.o: jcmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmaster.o: jcmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcomapi.o: jcomapi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcparam.o: jcparam.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcprepct.o: jcprepct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcsample.o: jcsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jctrans.o: jctrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapimin.o: jdapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapistd.o: jdapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdarith.o: jdarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdatadst.o: jdatadst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdatasrc.o: jdatasrc.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdcoefct.o: jdcoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdcolor.o: jdcolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jddctmgr.o: jddctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jdhuff.o: jdhuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdinput.o: jdinput.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmainct.o: jdmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmarker.o: jdmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmaster.o: jdmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmerge.o: jdmerge.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdpostct.o: jdpostct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdsample.o: jdsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdtrans.o: jdtrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jerror.o: jerror.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jversion.h jerror.h +jfdctflt.o: jfdctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctfst.o: jfdctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctint.o: jfdctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctflt.o: jidctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctfst.o: jidctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctint.o: jidctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jquant1.o: jquant1.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jquant2.o: jquant2.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jutils.o: jutils.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jmemmgr.o: jmemmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemansi.o: jmemansi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemname.o: jmemname.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemnobs.o: jmemnobs.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemdos.o: jmemdos.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemmac.o: jmemmac.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +cjpeg.o: cjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +djpeg.o: djpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +jpegtran.o: jpegtran.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h transupp.h jversion.h +rdjpgcom.o: rdjpgcom.c jinclude.h jconfig.h +wrjpgcom.o: wrjpgcom.c jinclude.h jconfig.h +cdjpeg.o: cdjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdcolmap.o: rdcolmap.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdswitch.o: rdswitch.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +transupp.o: transupp.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h transupp.h +rdppm.o: rdppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrppm.o: wrppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdgif.o: rdgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrgif.o: wrgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdtarga.o: rdtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrtarga.o: wrtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdbmp.o: rdbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrbmp.o: wrbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdrle.o: rdrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrrle.o: wrrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h diff --git a/jpeg-8c/makefile.bcc b/jpeg-8c/makefile.bcc new file mode 100644 index 00000000..d89e09bd --- /dev/null +++ b/jpeg-8c/makefile.bcc @@ -0,0 +1,292 @@ +# Makefile for Independent JPEG Group's software + +# This makefile is suitable for Borland C on MS-DOS or OS/2. +# It works with Borland C++ for DOS, revision 3.0 or later, +# and has been tested with Borland C++ for OS/2. +# Watch out for optimization bugs in the OS/2 compilers --- see notes below! +# Thanks to Tom Wright and Ge' Weijers (original DOS) and +# Ken Porter (OS/2) for this file. + +# Read installation instructions before saying "make" !! + +# Are we under DOS or OS/2? +!if !$d(DOS) && !$d(OS2) +!if $d(__OS2__) +OS2=1 +!else +DOS=1 +!endif +!endif + +# The name of your C compiler: +CC= bcc + +# You may need to adjust these cc options: +!if $d(DOS) +CFLAGS= -O2 -mm -w-par -w-stu -w-ccc -w-rch +!else +CFLAGS= -O1 -w-par -w-stu -w-ccc -w-rch +!endif +# -O2 enables full code optimization (for pre-3.0 Borland C++, use -O -G -Z). +# -O2 is buggy in Borland OS/2 C++ revision 2.0, so use -O1 there for now. +# If you have Borland OS/2 C++ revision 1.0, use -O or no optimization at all. +# -mm selects medium memory model (near data, far code pointers; DOS only!) +# -w-par suppresses warnings about unused function parameters +# -w-stu suppresses warnings about incomplete structures +# -w-ccc suppresses warnings about compile-time-constant conditions +# -w-rch suppresses warnings about unreachable code +# Generally, we recommend defining any configuration symbols in jconfig.h, +# NOT via -D switches here. + +# Link-time cc options: +!if $d(DOS) +LDFLAGS= -mm +# memory model option here must match CFLAGS! +!else +LDFLAGS= +# -lai full-screen app +# -lc case-significant link +!endif + +# Put here the object file name for the correct system-dependent memory +# manager file. +# For DOS, we recommend jmemdos.c and jmemdosa.asm. +# For OS/2, we recommend jmemnobs.c (flat memory!) +# SYSDEPMEMLIB must list the same files with "+" signs for the librarian. +!if $d(DOS) +SYSDEPMEM= jmemdos.obj jmemdosa.obj +SYSDEPMEMLIB= +jmemdos.obj +jmemdosa.obj +!else +SYSDEPMEM= jmemnobs.obj +SYSDEPMEMLIB= +jmemnobs.obj +!endif + +# End of configurable options. + + +# source files: JPEG library proper +LIBSOURCES= jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \ + jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \ + jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \ + jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \ + jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \ + jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \ + jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \ + jquant2.c jutils.c jmemmgr.c +# memmgr back ends: compile only one of these into a working library +SYSDEPSOURCES= jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c +# source files: cjpeg/djpeg/jpegtran applications, also rdjpgcom/wrjpgcom +APPSOURCES= cjpeg.c djpeg.c jpegtran.c rdjpgcom.c wrjpgcom.c cdjpeg.c \ + rdcolmap.c rdswitch.c transupp.c rdppm.c wrppm.c rdgif.c wrgif.c \ + rdtarga.c wrtarga.c rdbmp.c wrbmp.c rdrle.c wrrle.c +SOURCES= $(LIBSOURCES) $(SYSDEPSOURCES) $(APPSOURCES) +# files included by source files +INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \ + jpeglib.h jversion.h cdjpeg.h cderror.h transupp.h +# documentation, test, and support files +DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \ + wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \ + coderules.txt filelist.txt change.log +MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \ + makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \ + makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ + makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ + maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ + makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \ + makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \ + makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \ + makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \ + makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \ + makefile.mms makefile.vms makvms.opt +CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ + jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ + jconfig.vms +CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing +OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \ + libjpeg.map +TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \ + testimgp.jpg +DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \ + $(CONFIGUREFILES) $(OTHERFILES) $(TESTFILES) +# library object files common to compression and decompression +COMOBJECTS= jaricom.obj jcomapi.obj jutils.obj jerror.obj jmemmgr.obj $(SYSDEPMEM) +# compression library object files +CLIBOBJECTS= jcapimin.obj jcapistd.obj jcarith.obj jctrans.obj jcparam.obj \ + jdatadst.obj jcinit.obj jcmaster.obj jcmarker.obj jcmainct.obj \ + jcprepct.obj jccoefct.obj jccolor.obj jcsample.obj jchuff.obj \ + jcdctmgr.obj jfdctfst.obj jfdctflt.obj jfdctint.obj +# decompression library object files +DLIBOBJECTS= jdapimin.obj jdapistd.obj jdarith.obj jdtrans.obj jdatasrc.obj \ + jdmaster.obj jdinput.obj jdmarker.obj jdhuff.obj jdmainct.obj \ + jdcoefct.obj jdpostct.obj jddctmgr.obj jidctfst.obj jidctflt.obj \ + jidctint.obj jdsample.obj jdcolor.obj jquant1.obj jquant2.obj \ + jdmerge.obj +# These objectfiles are included in libjpeg.lib +LIBOBJECTS= $(CLIBOBJECTS) $(DLIBOBJECTS) $(COMOBJECTS) +# object files for sample applications (excluding library files) +COBJECTS= cjpeg.obj rdppm.obj rdgif.obj rdtarga.obj rdrle.obj rdbmp.obj \ + rdswitch.obj cdjpeg.obj +DOBJECTS= djpeg.obj wrppm.obj wrgif.obj wrtarga.obj wrrle.obj wrbmp.obj \ + rdcolmap.obj cdjpeg.obj +TROBJECTS= jpegtran.obj rdswitch.obj cdjpeg.obj transupp.obj + + +all: libjpeg.lib cjpeg.exe djpeg.exe jpegtran.exe rdjpgcom.exe wrjpgcom.exe + +libjpeg.lib: $(LIBOBJECTS) + - del libjpeg.lib + tlib libjpeg.lib /E /C @&&| ++jcapimin.obj +jcapistd.obj +jcarith.obj +jctrans.obj +jcparam.obj & ++jdatadst.obj +jcinit.obj +jcmaster.obj +jcmarker.obj +jcmainct.obj & ++jcprepct.obj +jccoefct.obj +jccolor.obj +jcsample.obj +jchuff.obj & ++jcdctmgr.obj +jfdctfst.obj +jfdctflt.obj +jfdctint.obj +jdapimin.obj & ++jdapistd.obj +jdarith.obj +jdtrans.obj +jdatasrc.obj +jdmaster.obj & ++jdinput.obj +jdmarker.obj +jdhuff.obj +jdmainct.obj +jdcoefct.obj & ++jdpostct.obj +jddctmgr.obj +jidctfst.obj +jidctflt.obj +jidctint.obj & ++jdsample.obj +jdcolor.obj +jquant1.obj +jquant2.obj +jdmerge.obj & ++jaricom.obj +jcomapi.obj +jutils.obj +jerror.obj +jmemmgr.obj & +$(SYSDEPMEMLIB) +| + +cjpeg.exe: $(COBJECTS) libjpeg.lib + $(CC) $(LDFLAGS) -ecjpeg.exe $(COBJECTS) libjpeg.lib + +djpeg.exe: $(DOBJECTS) libjpeg.lib + $(CC) $(LDFLAGS) -edjpeg.exe $(DOBJECTS) libjpeg.lib + +jpegtran.exe: $(TROBJECTS) libjpeg.lib + $(CC) $(LDFLAGS) -ejpegtran.exe $(TROBJECTS) libjpeg.lib + +rdjpgcom.exe: rdjpgcom.c +!if $d(DOS) + $(CC) -ms -O rdjpgcom.c +!else + $(CC) $(CFLAGS) rdjpgcom.c +!endif + +# On DOS, wrjpgcom needs large model so it can malloc a 64K chunk +wrjpgcom.exe: wrjpgcom.c +!if $d(DOS) + $(CC) -ml -O wrjpgcom.c +!else + $(CC) $(CFLAGS) wrjpgcom.c +!endif + +# This "{}" syntax allows Borland Make to "batch" source files. +# In this way, each run of the compiler can build many modules. +.c.obj: + $(CC) $(CFLAGS) -c{ $<} + +jconfig.h: jconfig.txt + echo You must prepare a system-dependent jconfig.h file. + echo Please read the installation directions in install.txt. + exit 1 + +clean: + - del *.obj + - del libjpeg.lib + - del cjpeg.exe + - del djpeg.exe + - del jpegtran.exe + - del rdjpgcom.exe + - del wrjpgcom.exe + - del testout*.* + +test: cjpeg.exe djpeg.exe jpegtran.exe + - del testout*.* + djpeg -dct int -ppm -outfile testout.ppm testorig.jpg + djpeg -dct int -bmp -colors 256 -outfile testout.bmp testorig.jpg + cjpeg -dct int -outfile testout.jpg testimg.ppm + djpeg -dct int -ppm -outfile testoutp.ppm testprog.jpg + cjpeg -dct int -progressive -opt -outfile testoutp.jpg testimg.ppm + jpegtran -outfile testoutt.jpg testprog.jpg +!if $d(DOS) + fc /b testimg.ppm testout.ppm + fc /b testimg.bmp testout.bmp + fc /b testimg.jpg testout.jpg + fc /b testimg.ppm testoutp.ppm + fc /b testimgp.jpg testoutp.jpg + fc /b testorig.jpg testoutt.jpg +!else + echo n > n.tmp + comp testimg.ppm testout.ppm < n.tmp + comp testimg.bmp testout.bmp < n.tmp + comp testimg.jpg testout.jpg < n.tmp + comp testimg.ppm testoutp.ppm < n.tmp + comp testimgp.jpg testoutp.jpg < n.tmp + comp testorig.jpg testoutt.jpg < n.tmp + del n.tmp +!endif + + +jaricom.obj: jaricom.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapimin.obj: jcapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapistd.obj: jcapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcarith.obj: jcarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccoefct.obj: jccoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccolor.obj: jccolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcdctmgr.obj: jcdctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jchuff.obj: jchuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcinit.obj: jcinit.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmainct.obj: jcmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmarker.obj: jcmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmaster.obj: jcmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcomapi.obj: jcomapi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcparam.obj: jcparam.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcprepct.obj: jcprepct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcsample.obj: jcsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jctrans.obj: jctrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapimin.obj: jdapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapistd.obj: jdapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdarith.obj: jdarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdatadst.obj: jdatadst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdatasrc.obj: jdatasrc.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdcoefct.obj: jdcoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdcolor.obj: jdcolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jddctmgr.obj: jddctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jdhuff.obj: jdhuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdinput.obj: jdinput.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmainct.obj: jdmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmarker.obj: jdmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmaster.obj: jdmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmerge.obj: jdmerge.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdpostct.obj: jdpostct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdsample.obj: jdsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdtrans.obj: jdtrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jerror.obj: jerror.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jversion.h jerror.h +jfdctflt.obj: jfdctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctfst.obj: jfdctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctint.obj: jfdctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctflt.obj: jidctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctfst.obj: jidctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctint.obj: jidctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jquant1.obj: jquant1.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jquant2.obj: jquant2.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jutils.obj: jutils.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jmemmgr.obj: jmemmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemansi.obj: jmemansi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemname.obj: jmemname.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemnobs.obj: jmemnobs.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemdos.obj: jmemdos.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemmac.obj: jmemmac.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +cjpeg.obj: cjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +djpeg.obj: djpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +jpegtran.obj: jpegtran.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h transupp.h jversion.h +rdjpgcom.obj: rdjpgcom.c jinclude.h jconfig.h +wrjpgcom.obj: wrjpgcom.c jinclude.h jconfig.h +cdjpeg.obj: cdjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdcolmap.obj: rdcolmap.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdswitch.obj: rdswitch.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +transupp.obj: transupp.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h transupp.h +rdppm.obj: rdppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrppm.obj: wrppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdgif.obj: rdgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrgif.obj: wrgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdtarga.obj: rdtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrtarga.obj: wrtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdbmp.obj: rdbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrbmp.obj: wrbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdrle.obj: rdrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrrle.obj: wrrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +jmemdosa.obj: jmemdosa.asm + tasm /mx jmemdosa.asm diff --git a/jpeg-8c/makefile.dj b/jpeg-8c/makefile.dj new file mode 100644 index 00000000..37b6ee76 --- /dev/null +++ b/jpeg-8c/makefile.dj @@ -0,0 +1,227 @@ +# Makefile for Independent JPEG Group's software + +# This makefile is for DJGPP (Delorie's GNU C port on MS-DOS), v2.0 or later. +# Thanks to Frank J. Donahoe for this version. + +# Read installation instructions before saying "make" !! + +# The name of your C compiler: +CC= gcc + +# You may need to adjust these cc options: +CFLAGS= -O2 -Wall -I. +# Generally, we recommend defining any configuration symbols in jconfig.h, +# NOT via -D switches here. + +# Link-time cc options: +LDFLAGS= -s + +# To link any special libraries, add the necessary -l commands here. +LDLIBS= + +# Put here the object file name for the correct system-dependent memory +# manager file. For DJGPP this is usually jmemnobs.o, but you could +# use jmemname.o if you want to use named temp files instead of swap space. +SYSDEPMEM= jmemnobs.o + +# miscellaneous OS-dependent stuff +# linker +LN= $(CC) +# file deletion command +RM= del +# library (.a) file creation command +AR= ar rc +# second step in .a creation (use "touch" if not needed) +AR2= ranlib + +# End of configurable options. + + +# source files: JPEG library proper +LIBSOURCES= jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \ + jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \ + jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \ + jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \ + jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \ + jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \ + jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \ + jquant2.c jutils.c jmemmgr.c +# memmgr back ends: compile only one of these into a working library +SYSDEPSOURCES= jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c +# source files: cjpeg/djpeg/jpegtran applications, also rdjpgcom/wrjpgcom +APPSOURCES= cjpeg.c djpeg.c jpegtran.c rdjpgcom.c wrjpgcom.c cdjpeg.c \ + rdcolmap.c rdswitch.c transupp.c rdppm.c wrppm.c rdgif.c wrgif.c \ + rdtarga.c wrtarga.c rdbmp.c wrbmp.c rdrle.c wrrle.c +SOURCES= $(LIBSOURCES) $(SYSDEPSOURCES) $(APPSOURCES) +# files included by source files +INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \ + jpeglib.h jversion.h cdjpeg.h cderror.h transupp.h +# documentation, test, and support files +DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \ + wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \ + coderules.txt filelist.txt change.log +MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \ + makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \ + makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ + makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ + maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ + makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \ + makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \ + makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \ + makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \ + makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \ + makefile.mms makefile.vms makvms.opt +CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ + jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ + jconfig.vms +CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing +OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \ + libjpeg.map +TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \ + testimgp.jpg +DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \ + $(CONFIGUREFILES) $(OTHERFILES) $(TESTFILES) +# library object files common to compression and decompression +COMOBJECTS= jaricom.o jcomapi.o jutils.o jerror.o jmemmgr.o $(SYSDEPMEM) +# compression library object files +CLIBOBJECTS= jcapimin.o jcapistd.o jcarith.o jctrans.o jcparam.o \ + jdatadst.o jcinit.o jcmaster.o jcmarker.o jcmainct.o jcprepct.o \ + jccoefct.o jccolor.o jcsample.o jchuff.o jcdctmgr.o jfdctfst.o \ + jfdctflt.o jfdctint.o +# decompression library object files +DLIBOBJECTS= jdapimin.o jdapistd.o jdarith.o jdtrans.o jdatasrc.o \ + jdmaster.o jdinput.o jdmarker.o jdhuff.o jdmainct.o \ + jdcoefct.o jdpostct.o jddctmgr.o jidctfst.o jidctflt.o \ + jidctint.o jdsample.o jdcolor.o jquant1.o jquant2.o jdmerge.o +# These objectfiles are included in libjpeg.a +LIBOBJECTS= $(CLIBOBJECTS) $(DLIBOBJECTS) $(COMOBJECTS) +# object files for sample applications (excluding library files) +COBJECTS= cjpeg.o rdppm.o rdgif.o rdtarga.o rdrle.o rdbmp.o rdswitch.o \ + cdjpeg.o +DOBJECTS= djpeg.o wrppm.o wrgif.o wrtarga.o wrrle.o wrbmp.o rdcolmap.o \ + cdjpeg.o +TROBJECTS= jpegtran.o rdswitch.o cdjpeg.o transupp.o + + +all: libjpeg.a cjpeg.exe djpeg.exe jpegtran.exe rdjpgcom.exe wrjpgcom.exe + +libjpeg.a: $(LIBOBJECTS) + $(RM) libjpeg.a + $(AR) libjpeg.a $(LIBOBJECTS) + $(AR2) libjpeg.a + +cjpeg.exe: $(COBJECTS) libjpeg.a + $(LN) $(LDFLAGS) -o cjpeg.exe $(COBJECTS) libjpeg.a $(LDLIBS) + +djpeg.exe: $(DOBJECTS) libjpeg.a + $(LN) $(LDFLAGS) -o djpeg.exe $(DOBJECTS) libjpeg.a $(LDLIBS) + +jpegtran.exe: $(TROBJECTS) libjpeg.a + $(LN) $(LDFLAGS) -o jpegtran.exe $(TROBJECTS) libjpeg.a $(LDLIBS) + +rdjpgcom.exe: rdjpgcom.o + $(LN) $(LDFLAGS) -o rdjpgcom.exe rdjpgcom.o $(LDLIBS) + +wrjpgcom.exe: wrjpgcom.o + $(LN) $(LDFLAGS) -o wrjpgcom.exe wrjpgcom.o $(LDLIBS) + +jconfig.h: jconfig.txt + echo You must prepare a system-dependent jconfig.h file. + echo Please read the installation directions in install.txt. + exit 1 + +clean: + $(RM) *.o + $(RM) cjpeg.exe + $(RM) djpeg.exe + $(RM) jpegtran.exe + $(RM) rdjpgcom.exe + $(RM) wrjpgcom.exe + $(RM) libjpeg.a + $(RM) testout*.* + +test: cjpeg.exe djpeg.exe jpegtran.exe + $(RM) testout*.* + ./djpeg -dct int -ppm -outfile testout.ppm testorig.jpg + ./djpeg -dct int -bmp -colors 256 -outfile testout.bmp testorig.jpg + ./cjpeg -dct int -outfile testout.jpg testimg.ppm + ./djpeg -dct int -ppm -outfile testoutp.ppm testprog.jpg + ./cjpeg -dct int -progressive -opt -outfile testoutp.jpg testimg.ppm + ./jpegtran -outfile testoutt.jpg testprog.jpg + fc /b testimg.ppm testout.ppm + fc /b testimg.bmp testout.bmp + fc /b testimg.jpg testout.jpg + fc /b testimg.ppm testoutp.ppm + fc /b testimgp.jpg testoutp.jpg + fc /b testorig.jpg testoutt.jpg + + +jaricom.o: jaricom.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapimin.o: jcapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapistd.o: jcapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcarith.o: jcarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccoefct.o: jccoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccolor.o: jccolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcdctmgr.o: jcdctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jchuff.o: jchuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcinit.o: jcinit.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmainct.o: jcmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmarker.o: jcmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmaster.o: jcmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcomapi.o: jcomapi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcparam.o: jcparam.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcprepct.o: jcprepct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcsample.o: jcsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jctrans.o: jctrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapimin.o: jdapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapistd.o: jdapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdarith.o: jdarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdatadst.o: jdatadst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdatasrc.o: jdatasrc.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdcoefct.o: jdcoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdcolor.o: jdcolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jddctmgr.o: jddctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jdhuff.o: jdhuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdinput.o: jdinput.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmainct.o: jdmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmarker.o: jdmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmaster.o: jdmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmerge.o: jdmerge.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdpostct.o: jdpostct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdsample.o: jdsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdtrans.o: jdtrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jerror.o: jerror.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jversion.h jerror.h +jfdctflt.o: jfdctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctfst.o: jfdctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctint.o: jfdctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctflt.o: jidctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctfst.o: jidctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctint.o: jidctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jquant1.o: jquant1.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jquant2.o: jquant2.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jutils.o: jutils.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jmemmgr.o: jmemmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemansi.o: jmemansi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemname.o: jmemname.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemnobs.o: jmemnobs.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemdos.o: jmemdos.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemmac.o: jmemmac.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +cjpeg.o: cjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +djpeg.o: djpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +jpegtran.o: jpegtran.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h transupp.h jversion.h +rdjpgcom.o: rdjpgcom.c jinclude.h jconfig.h +wrjpgcom.o: wrjpgcom.c jinclude.h jconfig.h +cdjpeg.o: cdjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdcolmap.o: rdcolmap.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdswitch.o: rdswitch.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +transupp.o: transupp.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h transupp.h +rdppm.o: rdppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrppm.o: wrppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdgif.o: rdgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrgif.o: wrgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdtarga.o: rdtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrtarga.o: wrtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdbmp.o: rdbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrbmp.o: wrbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdrle.o: rdrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrrle.o: wrrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h diff --git a/jpeg-8c/makefile.manx b/jpeg-8c/makefile.manx new file mode 100644 index 00000000..471f4082 --- /dev/null +++ b/jpeg-8c/makefile.manx @@ -0,0 +1,221 @@ +# Makefile for Independent JPEG Group's software + +# This makefile is for Amiga systems using Manx Aztec C ver 5.x. +# Thanks to D.J. James (djjames@cup.portal.com) for this version. + +# Read installation instructions before saying "make" !! + +# The name of your C compiler: +CC= cc + +# You may need to adjust these cc options: +# Uncomment for generic 68000 code (will work on any Amiga) +ARCHFLAGS= -sn + +# Uncomment for 68020/68030 code (faster, but won't run on 68000 CPU) +#ARCHFLAGS= -c2 + +CFLAGS= -MC -MD $(ARCHFLAGS) -spfam -r4 + +# Link-time cc options: +LDFLAGS= -g + +# To link any special libraries, add the necessary -l commands here. +LDLIBS= -lml -lcl + +# Put here the object file name for the correct system-dependent memory +# manager file. For Amiga we recommend jmemname.o. +SYSDEPMEM= jmemname.o + +# miscellaneous OS-dependent stuff +# linker +LN= ln +# file deletion command +RM= delete quiet +# library (.lib) file creation command +AR= lb + +# End of configurable options. + + +# source files: JPEG library proper +LIBSOURCES= jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \ + jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \ + jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \ + jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \ + jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \ + jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \ + jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \ + jquant2.c jutils.c jmemmgr.c +# memmgr back ends: compile only one of these into a working library +SYSDEPSOURCES= jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c +# source files: cjpeg/djpeg/jpegtran applications, also rdjpgcom/wrjpgcom +APPSOURCES= cjpeg.c djpeg.c jpegtran.c rdjpgcom.c wrjpgcom.c cdjpeg.c \ + rdcolmap.c rdswitch.c transupp.c rdppm.c wrppm.c rdgif.c wrgif.c \ + rdtarga.c wrtarga.c rdbmp.c wrbmp.c rdrle.c wrrle.c +SOURCES= $(LIBSOURCES) $(SYSDEPSOURCES) $(APPSOURCES) +# files included by source files +INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \ + jpeglib.h jversion.h cdjpeg.h cderror.h transupp.h +# documentation, test, and support files +DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \ + wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \ + coderules.txt filelist.txt change.log +MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \ + makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \ + makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ + makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ + maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ + makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \ + makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \ + makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \ + makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \ + makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \ + makefile.mms makefile.vms makvms.opt +CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ + jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ + jconfig.vms +CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing +OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \ + libjpeg.map +TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \ + testimgp.jpg +DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \ + $(CONFIGUREFILES) $(OTHERFILES) $(TESTFILES) +# library object files common to compression and decompression +COMOBJECTS= jaricom.o jcomapi.o jutils.o jerror.o jmemmgr.o $(SYSDEPMEM) +# compression library object files +CLIBOBJECTS= jcapimin.o jcapistd.o jcarith.o jctrans.o jcparam.o \ + jdatadst.o jcinit.o jcmaster.o jcmarker.o jcmainct.o jcprepct.o \ + jccoefct.o jccolor.o jcsample.o jchuff.o jcdctmgr.o jfdctfst.o \ + jfdctflt.o jfdctint.o +# decompression library object files +DLIBOBJECTS= jdapimin.o jdapistd.o jdarith.o jdtrans.o jdatasrc.o \ + jdmaster.o jdinput.o jdmarker.o jdhuff.o jdmainct.o \ + jdcoefct.o jdpostct.o jddctmgr.o jidctfst.o jidctflt.o \ + jidctint.o jdsample.o jdcolor.o jquant1.o jquant2.o jdmerge.o +# These objectfiles are included in libjpeg.lib +LIBOBJECTS= $(CLIBOBJECTS) $(DLIBOBJECTS) $(COMOBJECTS) +# object files for sample applications (excluding library files) +COBJECTS= cjpeg.o rdppm.o rdgif.o rdtarga.o rdrle.o rdbmp.o rdswitch.o \ + cdjpeg.o +DOBJECTS= djpeg.o wrppm.o wrgif.o wrtarga.o wrrle.o wrbmp.o rdcolmap.o \ + cdjpeg.o +TROBJECTS= jpegtran.o rdswitch.o cdjpeg.o transupp.o + + +all: libjpeg.lib cjpeg djpeg jpegtran rdjpgcom wrjpgcom + +libjpeg.lib: $(LIBOBJECTS) + -$(RM) libjpeg.lib + $(AR) libjpeg.lib $(LIBOBJECTS) + +cjpeg: $(COBJECTS) libjpeg.lib + $(LN) $(LDFLAGS) -o cjpeg $(COBJECTS) libjpeg.lib $(LDLIBS) + +djpeg: $(DOBJECTS) libjpeg.lib + $(LN) $(LDFLAGS) -o djpeg $(DOBJECTS) libjpeg.lib $(LDLIBS) + +jpegtran: $(TROBJECTS) libjpeg.lib + $(LN) $(LDFLAGS) -o jpegtran $(TROBJECTS) libjpeg.lib $(LDLIBS) + +rdjpgcom: rdjpgcom.o + $(LN) $(LDFLAGS) -o rdjpgcom rdjpgcom.o $(LDLIBS) + +wrjpgcom: wrjpgcom.o + $(LN) $(LDFLAGS) -o wrjpgcom wrjpgcom.o $(LDLIBS) + +jconfig.h: jconfig.txt + echo You must prepare a system-dependent jconfig.h file. + echo Please read the installation directions in install.txt. + exit 1 + +clean: + -$(RM) *.o cjpeg djpeg jpegtran libjpeg.lib rdjpgcom wrjpgcom + -$(RM) core testout*.* + +test: cjpeg djpeg jpegtran + -$(RM) testout*.* + djpeg -dct int -ppm -outfile testout.ppm testorig.jpg + djpeg -dct int -bmp -colors 256 -outfile testout.bmp testorig.jpg + cjpeg -dct int -outfile testout.jpg testimg.ppm + djpeg -dct int -ppm -outfile testoutp.ppm testprog.jpg + cjpeg -dct int -progressive -opt -outfile testoutp.jpg testimg.ppm + jpegtran -outfile testoutt.jpg testprog.jpg + cmp testimg.ppm testout.ppm + cmp testimg.bmp testout.bmp + cmp testimg.jpg testout.jpg + cmp testimg.ppm testoutp.ppm + cmp testimgp.jpg testoutp.jpg + cmp testorig.jpg testoutt.jpg + + +jaricom.o: jaricom.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapimin.o: jcapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapistd.o: jcapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcarith.o: jcarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccoefct.o: jccoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccolor.o: jccolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcdctmgr.o: jcdctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jchuff.o: jchuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcinit.o: jcinit.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmainct.o: jcmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmarker.o: jcmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmaster.o: jcmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcomapi.o: jcomapi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcparam.o: jcparam.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcprepct.o: jcprepct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcsample.o: jcsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jctrans.o: jctrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapimin.o: jdapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapistd.o: jdapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdarith.o: jdarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdatadst.o: jdatadst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdatasrc.o: jdatasrc.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdcoefct.o: jdcoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdcolor.o: jdcolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jddctmgr.o: jddctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jdhuff.o: jdhuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdinput.o: jdinput.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmainct.o: jdmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmarker.o: jdmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmaster.o: jdmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmerge.o: jdmerge.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdpostct.o: jdpostct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdsample.o: jdsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdtrans.o: jdtrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jerror.o: jerror.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jversion.h jerror.h +jfdctflt.o: jfdctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctfst.o: jfdctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctint.o: jfdctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctflt.o: jidctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctfst.o: jidctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctint.o: jidctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jquant1.o: jquant1.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jquant2.o: jquant2.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jutils.o: jutils.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jmemmgr.o: jmemmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemansi.o: jmemansi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemname.o: jmemname.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemnobs.o: jmemnobs.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemdos.o: jmemdos.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemmac.o: jmemmac.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +cjpeg.o: cjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +djpeg.o: djpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +jpegtran.o: jpegtran.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h transupp.h jversion.h +rdjpgcom.o: rdjpgcom.c jinclude.h jconfig.h +wrjpgcom.o: wrjpgcom.c jinclude.h jconfig.h +cdjpeg.o: cdjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdcolmap.o: rdcolmap.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdswitch.o: rdswitch.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +transupp.o: transupp.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h transupp.h +rdppm.o: rdppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrppm.o: wrppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdgif.o: rdgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrgif.o: wrgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdtarga.o: rdtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrtarga.o: wrtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdbmp.o: rdbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrbmp.o: wrbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdrle.o: rdrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrrle.o: wrrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h diff --git a/jpeg-8c/makefile.mc6 b/jpeg-8c/makefile.mc6 new file mode 100644 index 00000000..1ee83be0 --- /dev/null +++ b/jpeg-8c/makefile.mc6 @@ -0,0 +1,256 @@ +# Makefile for Independent JPEG Group's software + +# This makefile is for Microsoft C for MS-DOS, version 6.00A and up. +# Use NMAKE, not Microsoft's brain-damaged MAKE. +# Thanks to Alan Wright and Chris Turner of Olivetti Research Ltd. + +# Read installation instructions before saying "nmake" !! + +# You may need to adjust these compiler options: +CFLAGS = -AM -Oecigt -Gs -W3 +# -AM medium memory model (or use -AS for small model, if you remove features) +# -Oecigt -Gs maximum safe optimisation (-Ol has bugs in MSC 6.00A) +# -W3 warning level 3 +# You might also want to add -G2 if you have an 80286, etc. +# Generally, we recommend defining any configuration symbols in jconfig.h, +# NOT via -D switches here. + +# Jan-Herman Buining suggests the following switches for MS C 8.0 and a 486: +# CFLAGS = /AM /f- /FPi87 /G3 /Gs /Gy /Ob1 /Oc /Oe /Og /Oi /Ol /On /Oo /Ot \ +# /OV4 /W3 +# except for jquant1.c, which must be compiled with /Oo- to avoid a compiler +# crash. + +# Ingar Steinsland suggests the following switches when building +# a 16-bit Windows DLL: +# CFLAGS = -ALw -Gsw -Zpe -W3 -O2 -Zi -Zd + +# Put here the object file name for the correct system-dependent memory +# manager file. For DOS, we recommend jmemdos.c and jmemdosa.asm. +# (But not for Windows; see install.txt if you use this makefile for Windows.) +SYSDEPMEM= jmemdos.obj jmemdosa.obj +# SYSDEPMEMLIB must list the same files with "+" signs for the librarian. +SYSDEPMEMLIB= +jmemdos.obj +jmemdosa.obj + +# End of configurable options. + + +# source files: JPEG library proper +LIBSOURCES= jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \ + jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \ + jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \ + jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \ + jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \ + jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \ + jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \ + jquant2.c jutils.c jmemmgr.c +# memmgr back ends: compile only one of these into a working library +SYSDEPSOURCES= jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c +# source files: cjpeg/djpeg/jpegtran applications, also rdjpgcom/wrjpgcom +APPSOURCES= cjpeg.c djpeg.c jpegtran.c rdjpgcom.c wrjpgcom.c cdjpeg.c \ + rdcolmap.c rdswitch.c transupp.c rdppm.c wrppm.c rdgif.c wrgif.c \ + rdtarga.c wrtarga.c rdbmp.c wrbmp.c rdrle.c wrrle.c +SOURCES= $(LIBSOURCES) $(SYSDEPSOURCES) $(APPSOURCES) +# files included by source files +INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \ + jpeglib.h jversion.h cdjpeg.h cderror.h transupp.h +# documentation, test, and support files +DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \ + wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \ + coderules.txt filelist.txt change.log +MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \ + makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \ + makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ + makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ + maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ + makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \ + makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \ + makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \ + makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \ + makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \ + makefile.mms makefile.vms makvms.opt +CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ + jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ + jconfig.vms +CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing +OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \ + libjpeg.map +TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \ + testimgp.jpg +DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \ + $(CONFIGUREFILES) $(OTHERFILES) $(TESTFILES) +# library object files common to compression and decompression +COMOBJECTS= jaricom.obj jcomapi.obj jutils.obj jerror.obj jmemmgr.obj $(SYSDEPMEM) +# compression library object files +CLIBOBJECTS= jcapimin.obj jcapistd.obj jcarith.obj jctrans.obj jcparam.obj \ + jdatadst.obj jcinit.obj jcmaster.obj jcmarker.obj jcmainct.obj \ + jcprepct.obj jccoefct.obj jccolor.obj jcsample.obj jchuff.obj \ + jcdctmgr.obj jfdctfst.obj jfdctflt.obj jfdctint.obj +# decompression library object files +DLIBOBJECTS= jdapimin.obj jdapistd.obj jdarith.obj jdtrans.obj jdatasrc.obj \ + jdmaster.obj jdinput.obj jdmarker.obj jdhuff.obj jdmainct.obj \ + jdcoefct.obj jdpostct.obj jddctmgr.obj jidctfst.obj jidctflt.obj \ + jidctint.obj jdsample.obj jdcolor.obj jquant1.obj jquant2.obj \ + jdmerge.obj +# These objectfiles are included in libjpeg.lib +LIBOBJECTS= $(CLIBOBJECTS) $(DLIBOBJECTS) $(COMOBJECTS) +# object files for sample applications (excluding library files) +COBJECTS= cjpeg.obj rdppm.obj rdgif.obj rdtarga.obj rdrle.obj rdbmp.obj \ + rdswitch.obj cdjpeg.obj +DOBJECTS= djpeg.obj wrppm.obj wrgif.obj wrtarga.obj wrrle.obj wrbmp.obj \ + rdcolmap.obj cdjpeg.obj +TROBJECTS= jpegtran.obj rdswitch.obj cdjpeg.obj transupp.obj + +# need linker response file because file list > 128 chars +RFILE = libjpeg.ans + + +all: libjpeg.lib cjpeg.exe djpeg.exe jpegtran.exe rdjpgcom.exe wrjpgcom.exe + +libjpeg.lib: $(LIBOBJECTS) $(RFILE) + del libjpeg.lib + lib @$(RFILE) + +# linker response file for building libjpeg.lib +$(RFILE) : makefile + del $(RFILE) + echo libjpeg.lib >$(RFILE) +# silly want-to-create-it prompt: + echo y >>$(RFILE) + echo +jcapimin.obj +jcapistd.obj +jcarith.obj +jctrans.obj & >>$(RFILE) + echo +jcparam.obj +jdatadst.obj +jcinit.obj +jcmaster.obj & >>$(RFILE) + echo +jcmarker.obj +jcmainct.obj +jcprepct.obj & >>$(RFILE) + echo +jccoefct.obj +jccolor.obj +jcsample.obj +jchuff.obj & >>$(RFILE) + echo +jcdctmgr.obj +jfdctfst.obj +jfdctflt.obj & >>$(RFILE) + echo +jfdctint.obj +jdapimin.obj +jdapistd.obj & >>$(RFILE) + echo +jdarith.obj +jdtrans.obj +jdatasrc.obj +jdmaster.obj & >>$(RFILE) + echo +jdinput.obj +jdmarker.obj +jdhuff.obj +jdmainct.obj & >>$(RFILE) + echo +jdcoefct.obj +jdpostct.obj +jddctmgr.obj & >>$(RFILE) + echo +jidctfst.obj +jidctflt.obj +jidctint.obj & >>$(RFILE) + echo +jdsample.obj +jdcolor.obj +jquant1.obj & >>$(RFILE) + echo +jquant2.obj +jdmerge.obj +jaricom.obj +jcomapi.obj & >>$(RFILE) + echo +jutils.obj +jerror.obj +jmemmgr.obj & >>$(RFILE) + echo $(SYSDEPMEMLIB) ; >>$(RFILE) + +cjpeg.exe: $(COBJECTS) libjpeg.lib + echo $(COBJECTS) >cjpeg.lst + link /STACK:4096 /EXEPACK @cjpeg.lst, cjpeg.exe, , libjpeg.lib, ; + del cjpeg.lst + +djpeg.exe: $(DOBJECTS) libjpeg.lib + echo $(DOBJECTS) >djpeg.lst + link /STACK:4096 /EXEPACK @djpeg.lst, djpeg.exe, , libjpeg.lib, ; + del djpeg.lst + +jpegtran.exe: $(TROBJECTS) libjpeg.lib + link /STACK:4096 /EXEPACK $(TROBJECTS), jpegtran.exe, , libjpeg.lib, ; + +rdjpgcom.exe: rdjpgcom.c + $(CC) -AS -O -W3 rdjpgcom.c + +# wrjpgcom needs large model so it can malloc a 64K chunk +wrjpgcom.exe: wrjpgcom.c + $(CC) -AL -O -W3 wrjpgcom.c + +jconfig.h: jconfig.txt + echo You must prepare a system-dependent jconfig.h file. + echo Please read the installation directions in install.txt. + exit 1 + +clean: + del *.obj + del libjpeg.lib + del cjpeg.exe + del djpeg.exe + del jpegtran.exe + del rdjpgcom.exe + del wrjpgcom.exe + del testout*.* + +test: cjpeg.exe djpeg.exe jpegtran.exe + del testout*.* + djpeg -dct int -ppm -outfile testout.ppm testorig.jpg + djpeg -dct int -bmp -colors 256 -outfile testout.bmp testorig.jpg + cjpeg -dct int -outfile testout.jpg testimg.ppm + djpeg -dct int -ppm -outfile testoutp.ppm testprog.jpg + cjpeg -dct int -progressive -opt -outfile testoutp.jpg testimg.ppm + jpegtran -outfile testoutt.jpg testprog.jpg + fc /b testimg.ppm testout.ppm + fc /b testimg.bmp testout.bmp + fc /b testimg.jpg testout.jpg + fc /b testimg.ppm testoutp.ppm + fc /b testimgp.jpg testoutp.jpg + fc /b testorig.jpg testoutt.jpg + + +jaricom.obj: jaricom.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapimin.obj: jcapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapistd.obj: jcapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcarith.obj: jcarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccoefct.obj: jccoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccolor.obj: jccolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcdctmgr.obj: jcdctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jchuff.obj: jchuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcinit.obj: jcinit.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmainct.obj: jcmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmarker.obj: jcmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmaster.obj: jcmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcomapi.obj: jcomapi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcparam.obj: jcparam.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcprepct.obj: jcprepct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcsample.obj: jcsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jctrans.obj: jctrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapimin.obj: jdapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapistd.obj: jdapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdarith.obj: jdarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdatadst.obj: jdatadst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdatasrc.obj: jdatasrc.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdcoefct.obj: jdcoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdcolor.obj: jdcolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jddctmgr.obj: jddctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jdhuff.obj: jdhuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdinput.obj: jdinput.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmainct.obj: jdmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmarker.obj: jdmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmaster.obj: jdmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmerge.obj: jdmerge.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdpostct.obj: jdpostct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdsample.obj: jdsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdtrans.obj: jdtrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jerror.obj: jerror.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jversion.h jerror.h +jfdctflt.obj: jfdctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctfst.obj: jfdctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctint.obj: jfdctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctflt.obj: jidctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctfst.obj: jidctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctint.obj: jidctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jquant1.obj: jquant1.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jquant2.obj: jquant2.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jutils.obj: jutils.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jmemmgr.obj: jmemmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemansi.obj: jmemansi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemname.obj: jmemname.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemnobs.obj: jmemnobs.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemdos.obj: jmemdos.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemmac.obj: jmemmac.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +cjpeg.obj: cjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +djpeg.obj: djpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +jpegtran.obj: jpegtran.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h transupp.h jversion.h +rdjpgcom.obj: rdjpgcom.c jinclude.h jconfig.h +wrjpgcom.obj: wrjpgcom.c jinclude.h jconfig.h +cdjpeg.obj: cdjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdcolmap.obj: rdcolmap.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdswitch.obj: rdswitch.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +transupp.obj: transupp.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h transupp.h +rdppm.obj: rdppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrppm.obj: wrppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdgif.obj: rdgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrgif.obj: wrgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdtarga.obj: rdtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrtarga.obj: wrtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdbmp.obj: rdbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrbmp.obj: wrbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdrle.obj: rdrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrrle.obj: wrrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +jmemdosa.obj : jmemdosa.asm + masm /mx $*; diff --git a/jpeg-8c/makefile.mms b/jpeg-8c/makefile.mms new file mode 100644 index 00000000..6019dfa4 --- /dev/null +++ b/jpeg-8c/makefile.mms @@ -0,0 +1,225 @@ +# Makefile for Independent JPEG Group's software + +# This makefile is for use with MMS on Digital VMS systems. +# Thanks to Rick Dyson (dyson@iowasp.physics.uiowa.edu) +# and Tim Bell (tbell@netcom.com) for their help. + +# Read installation instructions before saying "MMS" !! + +# You may need to adjust these cc options: +CFLAGS= $(CFLAGS) /NoDebug /Optimize +# Generally, we recommend defining any configuration symbols in jconfig.h, +# NOT via /Define switches here. +.ifdef ALPHA +OPT= +.else +OPT= ,Sys$Disk:[]MAKVMS.OPT/Option +.endif + +# Put here the object file name for the correct system-dependent memory +# manager file. For Unix this is usually jmemnobs.o, but you may want +# to use jmemansi.o or jmemname.o if you have limited swap space. +SYSDEPMEM= jmemnobs.obj + +# End of configurable options. + + +# source files: JPEG library proper +LIBSOURCES= jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \ + jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \ + jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \ + jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \ + jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \ + jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \ + jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \ + jquant2.c jutils.c jmemmgr.c +# memmgr back ends: compile only one of these into a working library +SYSDEPSOURCES= jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c +# source files: cjpeg/djpeg/jpegtran applications, also rdjpgcom/wrjpgcom +APPSOURCES= cjpeg.c djpeg.c jpegtran.c rdjpgcom.c wrjpgcom.c cdjpeg.c \ + rdcolmap.c rdswitch.c transupp.c rdppm.c wrppm.c rdgif.c wrgif.c \ + rdtarga.c wrtarga.c rdbmp.c wrbmp.c rdrle.c wrrle.c +SOURCES= $(LIBSOURCES) $(SYSDEPSOURCES) $(APPSOURCES) +# files included by source files +INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \ + jpeglib.h jversion.h cdjpeg.h cderror.h transupp.h +# documentation, test, and support files +DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \ + wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \ + coderules.txt filelist.txt change.log +MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \ + makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \ + makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ + makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ + maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ + makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \ + makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \ + makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \ + makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \ + makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \ + makefile.mms makefile.vms makvms.opt +CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ + jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ + jconfig.vms +CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing +OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \ + libjpeg.map +TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \ + testimgp.jpg +DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \ + $(CONFIGUREFILES) $(OTHERFILES) $(TESTFILES) +# library object files common to compression and decompression +COMOBJECTS= jaricom.obj jcomapi.obj jutils.obj jerror.obj jmemmgr.obj $(SYSDEPMEM) +# compression library object files +CLIBOBJECTS= jcapimin.obj jcapistd.obj jcarith.obj jctrans.obj jcparam.obj \ + jdatadst.obj jcinit.obj jcmaster.obj jcmarker.obj jcmainct.obj \ + jcprepct.obj jccoefct.obj jccolor.obj jcsample.obj jchuff.obj \ + jcdctmgr.obj jfdctfst.obj jfdctflt.obj jfdctint.obj +# decompression library object files +DLIBOBJECTS= jdapimin.obj jdapistd.obj jdarith.obj jdtrans.obj jdatasrc.obj \ + jdmaster.obj jdinput.obj jdmarker.obj jdhuff.obj jdmainct.obj \ + jdcoefct.obj jdpostct.obj jddctmgr.obj jidctfst.obj jidctflt.obj \ + jidctint.obj jdsample.obj jdcolor.obj jquant1.obj jquant2.obj \ + jdmerge.obj +# These objectfiles are included in libjpeg.olb +LIBOBJECTS= $(CLIBOBJECTS) $(DLIBOBJECTS) $(COMOBJECTS) +# object files for sample applications (excluding library files) +COBJECTS= cjpeg.obj rdppm.obj rdgif.obj rdtarga.obj rdrle.obj rdbmp.obj \ + rdswitch.obj cdjpeg.obj +DOBJECTS= djpeg.obj wrppm.obj wrgif.obj wrtarga.obj wrrle.obj wrbmp.obj \ + rdcolmap.obj cdjpeg.obj +TROBJECTS= jpegtran.obj rdswitch.obj cdjpeg.obj transupp.obj +# objectfile lists with commas --- what a crock +COBJLIST= cjpeg.obj,rdppm.obj,rdgif.obj,rdtarga.obj,rdrle.obj,rdbmp.obj,\ + rdswitch.obj,cdjpeg.obj +DOBJLIST= djpeg.obj,wrppm.obj,wrgif.obj,wrtarga.obj,wrrle.obj,wrbmp.obj,\ + rdcolmap.obj,cdjpeg.obj +TROBJLIST= jpegtran.obj,rdswitch.obj,cdjpeg.obj,transupp.obj +LIBOBJLIST= jaricom.obj,jcapimin.obj,jcapistd.obj,jcarith.obj,jctrans.obj,\ + jcparam.obj,jdatadst.obj,jcinit.obj,jcmaster.obj,jcmarker.obj,\ + jcmainct.obj,jcprepct.obj,jccoefct.obj,jccolor.obj,jcsample.obj,\ + jchuff.obj,jcdctmgr.obj,jfdctfst.obj,jfdctflt.obj,jfdctint.obj,\ + jdapimin.obj,jdapistd.obj,jdarith.obj,jdtrans.obj,jdatasrc.obj,\ + jdmaster.obj,jdinput.obj,jdmarker.obj,jdhuff.obj,jdmainct.obj,\ + jdcoefct.obj,jdpostct.obj,jddctmgr.obj,jidctfst.obj,jidctflt.obj,\ + jidctint.obj,jdsample.obj,jdcolor.obj,jquant1.obj,jquant2.obj,\ + jdmerge.obj,jcomapi.obj,jutils.obj,jerror.obj,jmemmgr.obj,$(SYSDEPMEM) + + +.first + @- Define /NoLog Sys Sys$Library + +ALL : libjpeg.olb cjpeg.exe djpeg.exe jpegtran.exe rdjpgcom.exe wrjpgcom.exe + @ Continue + +libjpeg.olb : $(LIBOBJECTS) + Library /Create libjpeg.olb $(LIBOBJLIST) + +cjpeg.exe : $(COBJECTS) libjpeg.olb + $(LINK) $(LFLAGS) /Executable = cjpeg.exe $(COBJLIST),libjpeg.olb/Library$(OPT) + +djpeg.exe : $(DOBJECTS) libjpeg.olb + $(LINK) $(LFLAGS) /Executable = djpeg.exe $(DOBJLIST),libjpeg.olb/Library$(OPT) + +jpegtran.exe : $(TROBJECTS) libjpeg.olb + $(LINK) $(LFLAGS) /Executable = jpegtran.exe $(TROBJLIST),libjpeg.olb/Library$(OPT) + +rdjpgcom.exe : rdjpgcom.obj + $(LINK) $(LFLAGS) /Executable = rdjpgcom.exe rdjpgcom.obj$(OPT) + +wrjpgcom.exe : wrjpgcom.obj + $(LINK) $(LFLAGS) /Executable = wrjpgcom.exe wrjpgcom.obj$(OPT) + +jconfig.h : jconfig.vms + @- Copy jconfig.vms jconfig.h + +clean : + @- Set Protection = Owner:RWED *.*;-1 + @- Set Protection = Owner:RWED *.OBJ + - Purge /NoLog /NoConfirm *.* + - Delete /NoLog /NoConfirm *.OBJ; + +test : cjpeg.exe djpeg.exe jpegtran.exe + mcr sys$disk:[]djpeg -dct int -ppm -outfile testout.ppm testorig.jpg + mcr sys$disk:[]djpeg -dct int -bmp -colors 256 -outfile testout.bmp testorig.jpg + mcr sys$disk:[]cjpeg -dct int -outfile testout.jpg testimg.ppm + mcr sys$disk:[]djpeg -dct int -ppm -outfile testoutp.ppm testprog.jpg + mcr sys$disk:[]cjpeg -dct int -progressive -opt -outfile testoutp.jpg testimg.ppm + mcr sys$disk:[]jpegtran -outfile testoutt.jpg testprog.jpg + - Backup /Compare/Log testimg.ppm testout.ppm + - Backup /Compare/Log testimg.bmp testout.bmp + - Backup /Compare/Log testimg.jpg testout.jpg + - Backup /Compare/Log testimg.ppm testoutp.ppm + - Backup /Compare/Log testimgp.jpg testoutp.jpg + - Backup /Compare/Log testorig.jpg testoutt.jpg + + +jaricom.obj : jaricom.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapimin.obj : jcapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapistd.obj : jcapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcarith.obj : jcarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccoefct.obj : jccoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccolor.obj : jccolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcdctmgr.obj : jcdctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jchuff.obj : jchuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcinit.obj : jcinit.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmainct.obj : jcmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmarker.obj : jcmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmaster.obj : jcmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcomapi.obj : jcomapi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcparam.obj : jcparam.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcprepct.obj : jcprepct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcsample.obj : jcsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jctrans.obj : jctrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapimin.obj : jdapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapistd.obj : jdapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdarith.obj : jdarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdatadst.obj : jdatadst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdatasrc.obj : jdatasrc.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdcoefct.obj : jdcoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdcolor.obj : jdcolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jddctmgr.obj : jddctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jdhuff.obj : jdhuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdinput.obj : jdinput.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmainct.obj : jdmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmarker.obj : jdmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmaster.obj : jdmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmerge.obj : jdmerge.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdpostct.obj : jdpostct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdsample.obj : jdsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdtrans.obj : jdtrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jerror.obj : jerror.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jversion.h jerror.h +jfdctflt.obj : jfdctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctfst.obj : jfdctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctint.obj : jfdctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctflt.obj : jidctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctfst.obj : jidctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctint.obj : jidctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jquant1.obj : jquant1.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jquant2.obj : jquant2.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jutils.obj : jutils.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jmemmgr.obj : jmemmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemansi.obj : jmemansi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemname.obj : jmemname.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemnobs.obj : jmemnobs.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemdos.obj : jmemdos.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemmac.obj : jmemmac.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +cjpeg.obj : cjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +djpeg.obj : djpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +jpegtran.obj : jpegtran.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h transupp.h jversion.h +rdjpgcom.obj : rdjpgcom.c jinclude.h jconfig.h +wrjpgcom.obj : wrjpgcom.c jinclude.h jconfig.h +cdjpeg.obj : cdjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdcolmap.obj : rdcolmap.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdswitch.obj : rdswitch.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +transupp.obj : transupp.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h transupp.h +rdppm.obj : rdppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrppm.obj : wrppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdgif.obj : rdgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrgif.obj : wrgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdtarga.obj : rdtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrtarga.obj : wrtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdbmp.obj : rdbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrbmp.obj : wrbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdrle.obj : rdrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrrle.obj : wrrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h diff --git a/jpeg-8c/makefile.sas b/jpeg-8c/makefile.sas new file mode 100644 index 00000000..252f8fba --- /dev/null +++ b/jpeg-8c/makefile.sas @@ -0,0 +1,259 @@ +# Makefile for Independent JPEG Group's software + +# This makefile is for Amiga systems using SAS C 6.0 and up. +# Thanks to Ed Hanway, Mark Rinfret, and Jim Zepeda. + +# Read installation instructions before saying "make" !! + +# The name of your C compiler: +CC= sc + +# You may need to adjust these cc options: +# Uncomment the following lines for generic 680x0 version +ARCHFLAGS= cpu=any +SUFFIX= + +# Uncomment the following lines for 68030-only version +#ARCHFLAGS= cpu=68030 +#SUFFIX=.030 + +CFLAGS= nostackcheck data=near parms=register optimize $(ARCHFLAGS) \ + ignore=104 ignore=304 ignore=306 +# ignore=104 disables warnings for mismatched const qualifiers +# ignore=304 disables warnings for variables being optimized out +# ignore=306 disables warnings for the inlining of functions +# Generally, we recommend defining any configuration symbols in jconfig.h, +# NOT via define switches here. + +# Link-time cc options: +LDFLAGS= SC SD ND BATCH + +# To link any special libraries, add the necessary commands here. +LDLIBS= LIB:scm.lib LIB:sc.lib + +# Put here the object file name for the correct system-dependent memory +# manager file. For Amiga we recommend jmemname.o. +SYSDEPMEM= jmemname.o + +# miscellaneous OS-dependent stuff +# linker +LN= slink +# file deletion command +RM= delete quiet +# library (.lib) file creation command +AR= oml + +# End of configurable options. + + +# source files: JPEG library proper +LIBSOURCES= jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \ + jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \ + jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \ + jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \ + jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \ + jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \ + jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \ + jquant2.c jutils.c jmemmgr.c +# memmgr back ends: compile only one of these into a working library +SYSDEPSOURCES= jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c +# source files: cjpeg/djpeg/jpegtran applications, also rdjpgcom/wrjpgcom +APPSOURCES= cjpeg.c djpeg.c jpegtran.c rdjpgcom.c wrjpgcom.c cdjpeg.c \ + rdcolmap.c rdswitch.c transupp.c rdppm.c wrppm.c rdgif.c wrgif.c \ + rdtarga.c wrtarga.c rdbmp.c wrbmp.c rdrle.c wrrle.c +SOURCES= $(LIBSOURCES) $(SYSDEPSOURCES) $(APPSOURCES) +# files included by source files +INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \ + jpeglib.h jversion.h cdjpeg.h cderror.h transupp.h +# documentation, test, and support files +DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \ + wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \ + coderules.txt filelist.txt change.log +MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \ + makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \ + makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ + makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ + maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ + makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \ + makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \ + makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \ + makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \ + makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \ + makefile.mms makefile.vms makvms.opt +CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ + jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ + jconfig.vms +CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing +OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \ + libjpeg.map +TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \ + testimgp.jpg +DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \ + $(CONFIGUREFILES) $(OTHERFILES) $(TESTFILES) +# library object files common to compression and decompression +COMOBJECTS= jaricom.o jcomapi.o jutils.o jerror.o jmemmgr.o $(SYSDEPMEM) +# compression library object files +CLIBOBJECTS= jcapimin.o jcapistd.o jcarith.o jctrans.o jcparam.o \ + jdatadst.o jcinit.o jcmaster.o jcmarker.o jcmainct.o jcprepct.o \ + jccoefct.o jccolor.o jcsample.o jchuff.o jcdctmgr.o jfdctfst.o \ + jfdctflt.o jfdctint.o +# decompression library object files +DLIBOBJECTS= jdapimin.o jdapistd.o jdarith.o jdtrans.o jdatasrc.o \ + jdmaster.o jdinput.o jdmarker.o jdhuff.o jdmainct.o \ + jdcoefct.o jdpostct.o jddctmgr.o jidctfst.o jidctflt.o \ + jidctint.o jdsample.o jdcolor.o jquant1.o jquant2.o jdmerge.o +# These objectfiles are included in libjpeg.lib +LIBOBJECTS= $(CLIBOBJECTS) $(DLIBOBJECTS) $(COMOBJECTS) +# object files for sample applications (excluding library files) +COBJECTS= cjpeg.o rdppm.o rdgif.o rdtarga.o rdrle.o rdbmp.o rdswitch.o \ + cdjpeg.o +DOBJECTS= djpeg.o wrppm.o wrgif.o wrtarga.o wrrle.o wrbmp.o rdcolmap.o \ + cdjpeg.o +TROBJECTS= jpegtran.o rdswitch.o cdjpeg.o transupp.o + + +all: libjpeg.lib cjpeg$(SUFFIX) djpeg$(SUFFIX) jpegtran$(SUFFIX) rdjpgcom$(SUFFIX) wrjpgcom$(SUFFIX) + +# note: do several AR steps to avoid command line length limitations + +libjpeg.lib: $(LIBOBJECTS) + -$(RM) libjpeg.lib + $(AR) libjpeg.lib r $(CLIBOBJECTS) + $(AR) libjpeg.lib r $(DLIBOBJECTS) + $(AR) libjpeg.lib r $(COMOBJECTS) + +cjpeg$(SUFFIX): $(COBJECTS) libjpeg.lib + $(LN) + +# You may want to adjust these compiler options: +CFLAGS= $(cflags) $(cdebug) $(cvars) -I. +# Generally, we recommend defining any configuration symbols in jconfig.h, +# NOT via -D switches here. + +# Link-time options: +LDFLAGS= $(ldebug) $(conlflags) + +# To link any special libraries, add the necessary commands here. +LDLIBS= $(conlibs) + +# Put here the object file name for the correct system-dependent memory +# manager file. For NT we suggest jmemnobs.obj, which expects the OS to +# provide adequate virtual memory. +SYSDEPMEM= jmemnobs.obj + +# miscellaneous OS-dependent stuff +# file deletion command +RM= del + +# End of configurable options. + + +# source files: JPEG library proper +LIBSOURCES= jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \ + jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \ + jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \ + jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \ + jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \ + jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \ + jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \ + jquant2.c jutils.c jmemmgr.c +# memmgr back ends: compile only one of these into a working library +SYSDEPSOURCES= jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c +# source files: cjpeg/djpeg/jpegtran applications, also rdjpgcom/wrjpgcom +APPSOURCES= cjpeg.c djpeg.c jpegtran.c rdjpgcom.c wrjpgcom.c cdjpeg.c \ + rdcolmap.c rdswitch.c transupp.c rdppm.c wrppm.c rdgif.c wrgif.c \ + rdtarga.c wrtarga.c rdbmp.c wrbmp.c rdrle.c wrrle.c +SOURCES= $(LIBSOURCES) $(SYSDEPSOURCES) $(APPSOURCES) +# files included by source files +INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \ + jpeglib.h jversion.h cdjpeg.h cderror.h transupp.h +# documentation, test, and support files +DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \ + wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \ + coderules.txt filelist.txt change.log +MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \ + makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \ + makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ + makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ + maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ + makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \ + makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \ + makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \ + makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \ + makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \ + makefile.mms makefile.vms makvms.opt +CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ + jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ + jconfig.vms +CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing +OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \ + libjpeg.map +TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \ + testimgp.jpg +DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \ + $(CONFIGUREFILES) $(OTHERFILES) $(TESTFILES) +# library object files common to compression and decompression +COMOBJECTS= jaricom.obj jcomapi.obj jutils.obj jerror.obj jmemmgr.obj $(SYSDEPMEM) +# compression library object files +CLIBOBJECTS= jcapimin.obj jcapistd.obj jcarith.obj jctrans.obj jcparam.obj \ + jdatadst.obj jcinit.obj jcmaster.obj jcmarker.obj jcmainct.obj \ + jcprepct.obj jccoefct.obj jccolor.obj jcsample.obj jchuff.obj \ + jcdctmgr.obj jfdctfst.obj jfdctflt.obj jfdctint.obj +# decompression library object files +DLIBOBJECTS= jdapimin.obj jdapistd.obj jdarith.obj jdtrans.obj jdatasrc.obj \ + jdmaster.obj jdinput.obj jdmarker.obj jdhuff.obj jdmainct.obj \ + jdcoefct.obj jdpostct.obj jddctmgr.obj jidctfst.obj jidctflt.obj \ + jidctint.obj jdsample.obj jdcolor.obj jquant1.obj jquant2.obj \ + jdmerge.obj +# These objectfiles are included in libjpeg.lib +LIBOBJECTS= $(CLIBOBJECTS) $(DLIBOBJECTS) $(COMOBJECTS) +# object files for sample applications (excluding library files) +COBJECTS= cjpeg.obj rdppm.obj rdgif.obj rdtarga.obj rdrle.obj rdbmp.obj \ + rdswitch.obj cdjpeg.obj +DOBJECTS= djpeg.obj wrppm.obj wrgif.obj wrtarga.obj wrrle.obj wrbmp.obj \ + rdcolmap.obj cdjpeg.obj +TROBJECTS= jpegtran.obj rdswitch.obj cdjpeg.obj transupp.obj + +# Template command for compiling .c to .obj +.c.obj: + $(cc) $(CFLAGS) $*.c + + +all: libjpeg.lib cjpeg.exe djpeg.exe jpegtran.exe rdjpgcom.exe wrjpgcom.exe + +libjpeg.lib: $(LIBOBJECTS) + $(RM) libjpeg.lib + lib -out:libjpeg.lib $(LIBOBJECTS) + +cjpeg.exe: $(COBJECTS) libjpeg.lib + $(link) $(LDFLAGS) -out:cjpeg.exe $(COBJECTS) libjpeg.lib $(LDLIBS) + +djpeg.exe: $(DOBJECTS) libjpeg.lib + $(link) $(LDFLAGS) -out:djpeg.exe $(DOBJECTS) libjpeg.lib $(LDLIBS) + +jpegtran.exe: $(TROBJECTS) libjpeg.lib + $(link) $(LDFLAGS) -out:jpegtran.exe $(TROBJECTS) libjpeg.lib $(LDLIBS) + +rdjpgcom.exe: rdjpgcom.obj + $(link) $(LDFLAGS) -out:rdjpgcom.exe rdjpgcom.obj $(LDLIBS) + +wrjpgcom.exe: wrjpgcom.obj + $(link) $(LDFLAGS) -out:wrjpgcom.exe wrjpgcom.obj $(LDLIBS) + + +clean: + $(RM) *.obj *.exe libjpeg.lib + $(RM) testout* + +setup-vc6: + ren jconfig.vc jconfig.h + ren makejdsw.vc6 jpeg.dsw + ren makeadsw.vc6 apps.dsw + ren makejmak.vc6 jpeg.mak + ren makejdep.vc6 jpeg.dep + ren makejdsp.vc6 jpeg.dsp + ren makecmak.vc6 cjpeg.mak + ren makecdep.vc6 cjpeg.dep + ren makecdsp.vc6 cjpeg.dsp + ren makedmak.vc6 djpeg.mak + ren makeddep.vc6 djpeg.dep + ren makeddsp.vc6 djpeg.dsp + ren maketmak.vc6 jpegtran.mak + ren maketdep.vc6 jpegtran.dep + ren maketdsp.vc6 jpegtran.dsp + ren makermak.vc6 rdjpgcom.mak + ren makerdep.vc6 rdjpgcom.dep + ren makerdsp.vc6 rdjpgcom.dsp + ren makewmak.vc6 wrjpgcom.mak + ren makewdep.vc6 wrjpgcom.dep + ren makewdsp.vc6 wrjpgcom.dsp + +setup-v10: + ren jconfig.vc jconfig.h + ren makejsln.v10 jpeg.sln + ren makeasln.v10 apps.sln + ren makejvcx.v10 jpeg.vcxproj + ren makejfil.v10 jpeg.vcxproj.filters + ren makecvcx.v10 cjpeg.vcxproj + ren makecfil.v10 cjpeg.vcxproj.filters + ren makedvcx.v10 djpeg.vcxproj + ren makedfil.v10 djpeg.vcxproj.filters + ren maketvcx.v10 jpegtran.vcxproj + ren maketfil.v10 jpegtran.vcxproj.filters + ren makervcx.v10 rdjpgcom.vcxproj + ren makerfil.v10 rdjpgcom.vcxproj.filters + ren makewvcx.v10 wrjpgcom.vcxproj + ren makewfil.v10 wrjpgcom.vcxproj.filters + +test: + IF EXIST testout* $(RM) testout* + .\djpeg -dct int -ppm -outfile testout.ppm testorig.jpg + .\djpeg -dct int -bmp -colors 256 -outfile testout.bmp testorig.jpg + .\cjpeg -dct int -outfile testout.jpg testimg.ppm + .\djpeg -dct int -ppm -outfile testoutp.ppm testprog.jpg + .\cjpeg -dct int -progressive -opt -outfile testoutp.jpg testimg.ppm + .\jpegtran -outfile testoutt.jpg testprog.jpg + fc /b testimg.ppm testout.ppm + fc /b testimg.bmp testout.bmp + fc /b testimg.jpg testout.jpg + fc /b testimg.ppm testoutp.ppm + fc /b testimgp.jpg testoutp.jpg + fc /b testorig.jpg testoutt.jpg + +test-build: + IF EXIST testout* $(RM) testout* + .\djpeg\Release\djpeg -dct int -ppm -outfile testout.ppm testorig.jpg + .\djpeg\Release\djpeg -dct int -bmp -colors 256 -outfile testout.bmp testorig.jpg + .\cjpeg\Release\cjpeg -dct int -outfile testout.jpg testimg.ppm + .\djpeg\Release\djpeg -dct int -ppm -outfile testoutp.ppm testprog.jpg + .\cjpeg\Release\cjpeg -dct int -progressive -opt -outfile testoutp.jpg testimg.ppm + .\jpegtran\Release\jpegtran -outfile testoutt.jpg testprog.jpg + fc /b testimg.ppm testout.ppm + fc /b testimg.bmp testout.bmp + fc /b testimg.jpg testout.jpg + fc /b testimg.ppm testoutp.ppm + fc /b testimgp.jpg testoutp.jpg + fc /b testorig.jpg testoutt.jpg + + +jaricom.obj: jaricom.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapimin.obj: jcapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapistd.obj: jcapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcarith.obj: jcarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccoefct.obj: jccoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccolor.obj: jccolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcdctmgr.obj: jcdctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jchuff.obj: jchuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcinit.obj: jcinit.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmainct.obj: jcmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmarker.obj: jcmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmaster.obj: jcmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcomapi.obj: jcomapi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcparam.obj: jcparam.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcprepct.obj: jcprepct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcsample.obj: jcsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jctrans.obj: jctrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapimin.obj: jdapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapistd.obj: jdapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdarith.obj: jdarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdatadst.obj: jdatadst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdatasrc.obj: jdatasrc.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdcoefct.obj: jdcoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdcolor.obj: jdcolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jddctmgr.obj: jddctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jdhuff.obj: jdhuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdinput.obj: jdinput.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmainct.obj: jdmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmarker.obj: jdmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmaster.obj: jdmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmerge.obj: jdmerge.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdpostct.obj: jdpostct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdsample.obj: jdsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdtrans.obj: jdtrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jerror.obj: jerror.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jversion.h jerror.h +jfdctflt.obj: jfdctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctfst.obj: jfdctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctint.obj: jfdctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctflt.obj: jidctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctfst.obj: jidctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctint.obj: jidctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jquant1.obj: jquant1.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jquant2.obj: jquant2.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jutils.obj: jutils.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jmemmgr.obj: jmemmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemansi.obj: jmemansi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemname.obj: jmemname.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemnobs.obj: jmemnobs.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemdos.obj: jmemdos.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemmac.obj: jmemmac.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +cjpeg.obj: cjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +djpeg.obj: djpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +jpegtran.obj: jpegtran.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h transupp.h jversion.h +rdjpgcom.obj: rdjpgcom.c jinclude.h jconfig.h +wrjpgcom.obj: wrjpgcom.c jinclude.h jconfig.h +cdjpeg.obj: cdjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdcolmap.obj: rdcolmap.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdswitch.obj: rdswitch.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +transupp.obj: transupp.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h transupp.h +rdppm.obj: rdppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrppm.obj: wrppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdgif.obj: rdgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrgif.obj: wrgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdtarga.obj: rdtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrtarga.obj: wrtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdbmp.obj: rdbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrbmp.obj: wrbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdrle.obj: rdrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrrle.obj: wrrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h diff --git a/jpeg-8c/makefile.vms b/jpeg-8c/makefile.vms new file mode 100644 index 00000000..a07d070d --- /dev/null +++ b/jpeg-8c/makefile.vms @@ -0,0 +1,142 @@ +$! Makefile for Independent JPEG Group's software +$! +$! This is a command procedure for Digital VMS systems that do not have MMS. +$! It builds the JPEG software by brute force, recompiling everything whether +$! or not it is necessary. It then runs the basic self-test. +$! Thanks to Rick Dyson (dyson@iowasp.physics.uiowa.edu) +$! and Tim Bell (tbell@netcom.com) for their help. +$! +$! Read installation instructions before running this!! +$! +$ If F$Mode () .eqs. "INTERACTIVE" +$ Then +$ VERIFY = F$Verify (0) +$ Else +$ VERIFY = F$Verify (1) +$ EndIf +$ On Control_Y Then GoTo End +$ On Error Then GoTo End +$ +$ If F$GetSyi ("HW_MODEL") .gt. 1023 +$ Then +$ OPT = "" +$ Else +$ OPT = ",Sys$Disk:[]makvms.opt/Option" +$ EndIf +$ +$ DoCompile := CC /NoDebug /Optimize /NoList +$! +$ DoCompile jaricom.c +$ DoCompile jcapimin.c +$ DoCompile jcapistd.c +$ DoCompile jcarith.c +$ DoCompile jctrans.c +$ DoCompile jcparam.c +$ DoCompile jdatadst.c +$ DoCompile jcinit.c +$ DoCompile jcmaster.c +$ DoCompile jcmarker.c +$ DoCompile jcmainct.c +$ DoCompile jcprepct.c +$ DoCompile jccoefct.c +$ DoCompile jccolor.c +$ DoCompile jcsample.c +$ DoCompile jchuff.c +$ DoCompile jcdctmgr.c +$ DoCompile jfdctfst.c +$ DoCompile jfdctflt.c +$ DoCompile jfdctint.c +$ DoCompile jdapimin.c +$ DoCompile jdapistd.c +$ DoCompile jdarith.c +$ DoCompile jdtrans.c +$ DoCompile jdatasrc.c +$ DoCompile jdmaster.c +$ DoCompile jdinput.c +$ DoCompile jdmarker.c +$ DoCompile jdhuff.c +$ DoCompile jdmainct.c +$ DoCompile jdcoefct.c +$ DoCompile jdpostct.c +$ DoCompile jddctmgr.c +$ DoCompile jidctfst.c +$ DoCompile jidctflt.c +$ DoCompile jidctint.c +$ DoCompile jdsample.c +$ DoCompile jdcolor.c +$ DoCompile jquant1.c +$ DoCompile jquant2.c +$ DoCompile jdmerge.c +$ DoCompile jcomapi.c +$ DoCompile jutils.c +$ DoCompile jerror.c +$ DoCompile jmemmgr.c +$ DoCompile jmemnobs.c +$! +$ Library /Create libjpeg.olb jaricom.obj,jcapimin.obj,jcapistd.obj, - + jcarith.obj,jctrans.obj,jcparam.obj,jdatadst.obj,jcinit.obj, - + jcmaster.obj,jcmarker.obj,jcmainct.obj,jcprepct.obj,jccoefct.obj, - + jccolor.obj,jcsample.obj,jchuff.obj,jcdctmgr.obj,jfdctfst.obj, - + jfdctflt.obj,jfdctint.obj,jdapimin.obj,jdapistd.obj,jdarith.obj, - + jdtrans.obj,jdatasrc.obj,jdmaster.obj,jdinput.obj,jdmarker.obj, - + jdhuff.obj,jdmainct.obj,jdcoefct.obj,jdpostct.obj,jddctmgr.obj, - + jidctfst.obj,jidctflt.obj,jidctint.obj,jdsample.obj,jdcolor.obj, - + jquant1.obj,jquant2.obj,jdmerge.obj,jcomapi.obj,jutils.obj, - + jerror.obj,jmemmgr.obj,jmemnobs.obj +$! +$ DoCompile cjpeg.c +$ DoCompile rdppm.c +$ DoCompile rdgif.c +$ DoCompile rdtarga.c +$ DoCompile rdrle.c +$ DoCompile rdbmp.c +$ DoCompile rdswitch.c +$ DoCompile cdjpeg.c +$! +$ Link /NoMap /Executable = cjpeg.exe cjpeg.obj,rdppm.obj,rdgif.obj, - + rdtarga.obj,rdrle.obj,rdbmp.obj,rdswitch.obj,cdjpeg.obj,libjpeg.olb/Library'OPT' +$! +$ DoCompile djpeg.c +$ DoCompile wrppm.c +$ DoCompile wrgif.c +$ DoCompile wrtarga.c +$ DoCompile wrrle.c +$ DoCompile wrbmp.c +$ DoCompile rdcolmap.c +$ DoCompile cdjpeg.c +$! +$ Link /NoMap /Executable = djpeg.exe djpeg.obj,wrppm.obj,wrgif.obj, - + wrtarga.obj,wrrle.obj,wrbmp.obj,rdcolmap.obj,cdjpeg.obj,libjpeg.olb/Library'OPT' +$! +$ DoCompile jpegtran.c +$ DoCompile rdswitch.c +$ DoCompile cdjpeg.c +$ DoCompile transupp.c +$! +$ Link /NoMap /Executable = jpegtran.exe jpegtran.obj,rdswitch.obj, - + cdjpeg.obj,transupp.obj,libjpeg.olb/Library'OPT' +$! +$ DoCompile rdjpgcom.c +$ Link /NoMap /Executable = rdjpgcom.exe rdjpgcom.obj'OPT' +$! +$ DoCompile wrjpgcom.c +$ Link /NoMap /Executable = wrjpgcom.exe wrjpgcom.obj'OPT' +$! +$! Run the self-test +$! +$ mcr sys$disk:[]djpeg -dct int -ppm -outfile testout.ppm testorig.jpg +$ mcr sys$disk:[]djpeg -dct int -bmp -colors 256 -outfile testout.bmp testorig.jpg +$ mcr sys$disk:[]cjpeg -dct int -outfile testout.jpg testimg.ppm +$ mcr sys$disk:[]djpeg -dct int -ppm -outfile testoutp.ppm testprog.jpg +$ mcr sys$disk:[]cjpeg -dct int -progressive -opt -outfile testoutp.jpg testimg.ppm +$ mcr sys$disk:[]jpegtran -outfile testoutt.jpg testprog.jpg +$ Backup /Compare/Log testimg.ppm testout.ppm +$ Backup /Compare/Log testimg.bmp testout.bmp +$ Backup /Compare/Log testimg.jpg testout.jpg +$ Backup /Compare/Log testimg.ppm testoutp.ppm +$ Backup /Compare/Log testimgp.jpg testoutp.jpg +$ Backup /Compare/Log testorig.jpg testoutt.jpg +$! +$End: +$ If Verify Then Set Verify +$ Exit diff --git a/jpeg-8c/makefile.wat b/jpeg-8c/makefile.wat new file mode 100644 index 00000000..a3e652bc --- /dev/null +++ b/jpeg-8c/makefile.wat @@ -0,0 +1,240 @@ +# Makefile for Independent JPEG Group's software + +# This makefile is suitable for Watcom C/C++ 10.0 on MS-DOS (using +# dos4g extender), OS/2, and Windows NT console mode. +# Thanks to Janos Haide, jhaide@btrvtech.com. + +# Read installation instructions before saying "wmake" !! + +# Uncomment line for desired system +SYSTEM=DOS +#SYSTEM=OS2 +#SYSTEM=NT + +# The name of your C compiler: +CC= wcl386 + +# You may need to adjust these cc options: +CFLAGS= -4r -ort -wx -zq -bt=$(SYSTEM) +# Caution: avoid -ol or -ox; these generate bad code with 10.0 or 10.0a. +# Generally, we recommend defining any configuration symbols in jconfig.h, +# NOT via -D switches here. + +# Link-time cc options: +!ifeq SYSTEM DOS +LDFLAGS= -zq -l=dos4g +!else ifeq SYSTEM OS2 +LDFLAGS= -zq -l=os2v2 +!else ifeq SYSTEM NT +LDFLAGS= -zq -l=nt +!endif + +# Put here the object file name for the correct system-dependent memory +# manager file. jmemnobs should work fine for dos4g or OS/2 environment. +SYSDEPMEM= jmemnobs.obj + +# End of configurable options. + + +# source files: JPEG library proper +LIBSOURCES= jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c & + jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c & + jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c & + jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c & + jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c & + jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c & + jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c & + jquant2.c jutils.c jmemmgr.c +# memmgr back ends: compile only one of these into a working library +SYSDEPSOURCES= jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c +# source files: cjpeg/djpeg/jpegtran applications, also rdjpgcom/wrjpgcom +APPSOURCES= cjpeg.c djpeg.c jpegtran.c rdjpgcom.c wrjpgcom.c cdjpeg.c & + rdcolmap.c rdswitch.c transupp.c rdppm.c wrppm.c rdgif.c wrgif.c & + rdtarga.c wrtarga.c rdbmp.c wrbmp.c rdrle.c wrrle.c +SOURCES= $(LIBSOURCES) $(SYSDEPSOURCES) $(APPSOURCES) +# files included by source files +INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h & + jpeglib.h jversion.h cdjpeg.h cderror.h transupp.h +# documentation, test, and support files +DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 & + wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt & + coderules.txt filelist.txt change.log +MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc & + makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 & + makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 & + makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 & + maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 & + makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 & + makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 & + makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 & + makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st & + makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas & + makefile.mms makefile.vms makvms.opt +CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat & + jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas & + jconfig.vms +CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing +OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm & + libjpeg.map +TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg & + testimgp.jpg +DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) & + $(CONFIGUREFILES) $(OTHERFILES) $(TESTFILES) +# library object files common to compression and decompression +COMOBJECTS= jaricom.obj jcomapi.obj jutils.obj jerror.obj jmemmgr.obj $(SYSDEPMEM) +# compression library object files +CLIBOBJECTS= jcapimin.obj jcapistd.obj jcarith.obj jctrans.obj jcparam.obj & + jdatadst.obj jcinit.obj jcmaster.obj jcmarker.obj jcmainct.obj & + jcprepct.obj jccoefct.obj jccolor.obj jcsample.obj jchuff.obj & + jcdctmgr.obj jfdctfst.obj jfdctflt.obj jfdctint.obj +# decompression library object files +DLIBOBJECTS= jdapimin.obj jdapistd.obj jdarith.obj jdtrans.obj jdatasrc.obj & + jdmaster.obj jdinput.obj jdmarker.obj jdhuff.obj jdmainct.obj & + jdcoefct.obj jdpostct.obj jddctmgr.obj jidctfst.obj jidctflt.obj & + jidctint.obj jdsample.obj jdcolor.obj jquant1.obj jquant2.obj & + jdmerge.obj +# These objectfiles are included in libjpeg.lib +LIBOBJECTS= $(CLIBOBJECTS) $(DLIBOBJECTS) $(COMOBJECTS) +# object files for sample applications (excluding library files) +COBJECTS= cjpeg.obj rdppm.obj rdgif.obj rdtarga.obj rdrle.obj rdbmp.obj & + rdswitch.obj cdjpeg.obj +DOBJECTS= djpeg.obj wrppm.obj wrgif.obj wrtarga.obj wrrle.obj wrbmp.obj & + rdcolmap.obj cdjpeg.obj +TROBJECTS= jpegtran.obj rdswitch.obj cdjpeg.obj transupp.obj + + +all: libjpeg.lib cjpeg.exe djpeg.exe jpegtran.exe rdjpgcom.exe wrjpgcom.exe + +libjpeg.lib: $(LIBOBJECTS) + - del libjpeg.lib + * wlib -n libjpeg.lib $(LIBOBJECTS) + +cjpeg.exe: $(COBJECTS) libjpeg.lib + $(CC) $(LDFLAGS) $(COBJECTS) libjpeg.lib + +djpeg.exe: $(DOBJECTS) libjpeg.lib + $(CC) $(LDFLAGS) $(DOBJECTS) libjpeg.lib + +jpegtran.exe: $(TROBJECTS) libjpeg.lib + $(CC) $(LDFLAGS) $(TROBJECTS) libjpeg.lib + +rdjpgcom.exe: rdjpgcom.c + $(CC) $(CFLAGS) $(LDFLAGS) rdjpgcom.c + +wrjpgcom.exe: wrjpgcom.c + $(CC) $(CFLAGS) $(LDFLAGS) wrjpgcom.c + +.c.obj: + $(CC) $(CFLAGS) -c $< + +jconfig.h: jconfig.txt + echo You must prepare a system-dependent jconfig.h file. + echo Please read the installation directions in install.txt. + exit 1 + +clean: .SYMBOLIC + - del *.obj + - del libjpeg.lib + - del cjpeg.exe + - del djpeg.exe + - del jpegtran.exe + - del rdjpgcom.exe + - del wrjpgcom.exe + - del testout*.* + +test: cjpeg.exe djpeg.exe jpegtran.exe .SYMBOLIC + - del testout*.* + djpeg -dct int -ppm -outfile testout.ppm testorig.jpg + djpeg -dct int -bmp -colors 256 -outfile testout.bmp testorig.jpg + cjpeg -dct int -outfile testout.jpg testimg.ppm + djpeg -dct int -ppm -outfile testoutp.ppm testprog.jpg + cjpeg -dct int -progressive -opt -outfile testoutp.jpg testimg.ppm + jpegtran -outfile testoutt.jpg testprog.jpg +!ifeq SYSTEM DOS + fc /b testimg.ppm testout.ppm + fc /b testimg.bmp testout.bmp + fc /b testimg.jpg testout.jpg + fc /b testimg.ppm testoutp.ppm + fc /b testimgp.jpg testoutp.jpg + fc /b testorig.jpg testoutt.jpg +!else + echo n > n.tmp + comp testimg.ppm testout.ppm < n.tmp + comp testimg.bmp testout.bmp < n.tmp + comp testimg.jpg testout.jpg < n.tmp + comp testimg.ppm testoutp.ppm < n.tmp + comp testimgp.jpg testoutp.jpg < n.tmp + comp testorig.jpg testoutt.jpg < n.tmp + del n.tmp +!endif + + +jaricom.obj: jaricom.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapimin.obj: jcapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcapistd.obj: jcapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcarith.obj: jcarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccoefct.obj: jccoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jccolor.obj: jccolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcdctmgr.obj: jcdctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jchuff.obj: jchuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcinit.obj: jcinit.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmainct.obj: jcmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmarker.obj: jcmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcmaster.obj: jcmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcomapi.obj: jcomapi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcparam.obj: jcparam.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcprepct.obj: jcprepct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jcsample.obj: jcsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jctrans.obj: jctrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapimin.obj: jdapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdapistd.obj: jdapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdarith.obj: jdarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdatadst.obj: jdatadst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdatasrc.obj: jdatasrc.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h +jdcoefct.obj: jdcoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdcolor.obj: jdcolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jddctmgr.obj: jddctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jdhuff.obj: jdhuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdinput.obj: jdinput.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmainct.obj: jdmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmarker.obj: jdmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmaster.obj: jdmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdmerge.obj: jdmerge.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdpostct.obj: jdpostct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdsample.obj: jdsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jdtrans.obj: jdtrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jerror.obj: jerror.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jversion.h jerror.h +jfdctflt.obj: jfdctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctfst.obj: jfdctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jfdctint.obj: jfdctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctflt.obj: jidctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctfst.obj: jidctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jidctint.obj: jidctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h +jquant1.obj: jquant1.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jquant2.obj: jquant2.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jutils.obj: jutils.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h +jmemmgr.obj: jmemmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemansi.obj: jmemansi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemname.obj: jmemname.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemnobs.obj: jmemnobs.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemdos.obj: jmemdos.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +jmemmac.obj: jmemmac.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h +cjpeg.obj: cjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +djpeg.obj: djpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h +jpegtran.obj: jpegtran.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h transupp.h jversion.h +rdjpgcom.obj: rdjpgcom.c jinclude.h jconfig.h +wrjpgcom.obj: wrjpgcom.c jinclude.h jconfig.h +cdjpeg.obj: cdjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdcolmap.obj: rdcolmap.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdswitch.obj: rdswitch.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +transupp.obj: transupp.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h transupp.h +rdppm.obj: rdppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrppm.obj: wrppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdgif.obj: rdgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrgif.obj: wrgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdtarga.obj: rdtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrtarga.obj: wrtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdbmp.obj: rdbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrbmp.obj: wrbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +rdrle.obj: rdrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h +wrrle.obj: wrrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h diff --git a/jpeg-8c/makejdep.vc6 b/jpeg-8c/makejdep.vc6 new file mode 100644 index 00000000..1065b214 --- /dev/null +++ b/jpeg-8c/makejdep.vc6 @@ -0,0 +1,423 @@ +# Microsoft Developer Studio erstellte Abhngigkeitsdatei, einbezogen von jpeg.mak + +.\jaricom.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jcapimin.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jcapistd.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jcarith.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jccoefct.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jccolor.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jcdctmgr.c : \ + ".\jconfig.h"\ + ".\jdct.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jchuff.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jcinit.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jcmainct.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jcmarker.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jcmaster.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jcomapi.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jcparam.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jcprepct.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jcsample.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jctrans.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jdapimin.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jdapistd.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jdarith.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jdatadst.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\jdatasrc.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\jdcoefct.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jdcolor.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jddctmgr.c : \ + ".\jconfig.h"\ + ".\jdct.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jdhuff.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jdinput.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jdmainct.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jdmarker.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jdmaster.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jdmerge.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jdpostct.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jdsample.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jdtrans.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jerror.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + ".\jversion.h"\ + + +.\jfdctflt.c : \ + ".\jconfig.h"\ + ".\jdct.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jfdctfst.c : \ + ".\jconfig.h"\ + ".\jdct.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jfdctint.c : \ + ".\jconfig.h"\ + ".\jdct.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jidctflt.c : \ + ".\jconfig.h"\ + ".\jdct.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jidctfst.c : \ + ".\jconfig.h"\ + ".\jdct.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jidctint.c : \ + ".\jconfig.h"\ + ".\jdct.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jmemmgr.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmemsys.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jmemnobs.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmemsys.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jquant1.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jquant2.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + + +.\jutils.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + diff --git a/jpeg-8c/makejdsp.vc6 b/jpeg-8c/makejdsp.vc6 new file mode 100644 index 00000000..738f1ab4 --- /dev/null +++ b/jpeg-8c/makejdsp.vc6 @@ -0,0 +1,285 @@ +# Microsoft Developer Studio Project File - Name="jpeg" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** NICHT BEARBEITEN ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=jpeg - Win32 +!MESSAGE Dies ist kein gltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE +!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und fhren Sie den Befehl +!MESSAGE +!MESSAGE NMAKE /f "jpeg.mak". +!MESSAGE +!MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben +!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: +!MESSAGE +!MESSAGE NMAKE /f "jpeg.mak" CFG="jpeg - Win32" +!MESSAGE +!MESSAGE Fr die Konfiguration stehen zur Auswahl: +!MESSAGE +!MESSAGE "jpeg - Win32" (basierend auf "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir ".\Release" +# PROP BASE Intermediate_Dir ".\Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir ".\Release" +# PROP Intermediate_Dir ".\Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c +# ADD CPP /nologo /G6 /MT /W3 /GX /Ox /Oa /Ob2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD BASE RSC /l 0x407 +# ADD RSC /l 0x407 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo +# Begin Target + +# Name "jpeg - Win32" +# Begin Group "Quellcodedateien" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\jaricom.c +# End Source File +# Begin Source File + +SOURCE=.\jcapimin.c +# End Source File +# Begin Source File + +SOURCE=.\jcapistd.c +# End Source File +# Begin Source File + +SOURCE=.\jcarith.c +# End Source File +# Begin Source File + +SOURCE=.\jccoefct.c +# End Source File +# Begin Source File + +SOURCE=.\jccolor.c +# End Source File +# Begin Source File + +SOURCE=.\jcdctmgr.c +# End Source File +# Begin Source File + +SOURCE=.\jchuff.c +# End Source File +# Begin Source File + +SOURCE=.\jcinit.c +# End Source File +# Begin Source File + +SOURCE=.\jcmainct.c +# End Source File +# Begin Source File + +SOURCE=.\jcmarker.c +# End Source File +# Begin Source File + +SOURCE=.\jcmaster.c +# End Source File +# Begin Source File + +SOURCE=.\jcomapi.c +# End Source File +# Begin Source File + +SOURCE=.\jcparam.c +# End Source File +# Begin Source File + +SOURCE=.\jcprepct.c +# End Source File +# Begin Source File + +SOURCE=.\jcsample.c +# End Source File +# Begin Source File + +SOURCE=.\jctrans.c +# End Source File +# Begin Source File + +SOURCE=.\jdapimin.c +# End Source File +# Begin Source File + +SOURCE=.\jdapistd.c +# End Source File +# Begin Source File + +SOURCE=.\jdarith.c +# End Source File +# Begin Source File + +SOURCE=.\jdatadst.c +# End Source File +# Begin Source File + +SOURCE=.\jdatasrc.c +# End Source File +# Begin Source File + +SOURCE=.\jdcoefct.c +# End Source File +# Begin Source File + +SOURCE=.\jdcolor.c +# End Source File +# Begin Source File + +SOURCE=.\jddctmgr.c +# End Source File +# Begin Source File + +SOURCE=.\jdhuff.c +# End Source File +# Begin Source File + +SOURCE=.\jdinput.c +# End Source File +# Begin Source File + +SOURCE=.\jdmainct.c +# End Source File +# Begin Source File + +SOURCE=.\jdmarker.c +# End Source File +# Begin Source File + +SOURCE=.\jdmaster.c +# End Source File +# Begin Source File + +SOURCE=.\jdmerge.c +# End Source File +# Begin Source File + +SOURCE=.\jdpostct.c +# End Source File +# Begin Source File + +SOURCE=.\jdsample.c +# End Source File +# Begin Source File + +SOURCE=.\jdtrans.c +# End Source File +# Begin Source File + +SOURCE=.\jerror.c +# End Source File +# Begin Source File + +SOURCE=.\jfdctflt.c +# End Source File +# Begin Source File + +SOURCE=.\jfdctfst.c +# End Source File +# Begin Source File + +SOURCE=.\jfdctint.c +# End Source File +# Begin Source File + +SOURCE=.\jidctflt.c +# End Source File +# Begin Source File + +SOURCE=.\jidctfst.c +# End Source File +# Begin Source File + +SOURCE=.\jidctint.c +# End Source File +# Begin Source File + +SOURCE=.\jmemmgr.c +# End Source File +# Begin Source File + +SOURCE=.\jmemnobs.c +# End Source File +# Begin Source File + +SOURCE=.\jquant1.c +# End Source File +# Begin Source File + +SOURCE=.\jquant2.c +# End Source File +# Begin Source File + +SOURCE=.\jutils.c +# End Source File +# End Group +# Begin Group "Header-Dateien" + +# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" +# Begin Source File + +SOURCE=.\jconfig.h +# End Source File +# Begin Source File + +SOURCE=.\jdct.h +# End Source File +# Begin Source File + +SOURCE=.\jerror.h +# End Source File +# Begin Source File + +SOURCE=.\jinclude.h +# End Source File +# Begin Source File + +SOURCE=.\jmemsys.h +# End Source File +# Begin Source File + +SOURCE=.\jmorecfg.h +# End Source File +# Begin Source File + +SOURCE=.\jpegint.h +# End Source File +# Begin Source File + +SOURCE=.\jpeglib.h +# End Source File +# Begin Source File + +SOURCE=.\jversion.h +# End Source File +# End Group +# Begin Group "Ressourcendateien" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/jpeg-8c/makejdsw.vc6 b/jpeg-8c/makejdsw.vc6 new file mode 100644 index 00000000..d11fab1d --- /dev/null +++ b/jpeg-8c/makejdsw.vc6 @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELSCHT WERDEN! + +############################################################################### + +Project: "jpeg"=".\jpeg.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/jpeg-8c/makejfil.v10 b/jpeg-8c/makejfil.v10 new file mode 100644 index 00000000..654bfc09 --- /dev/null +++ b/jpeg-8c/makejfil.v10 @@ -0,0 +1,186 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/jpeg-8c/makejmak.vc6 b/jpeg-8c/makejmak.vc6 new file mode 100644 index 00000000..1107336b --- /dev/null +++ b/jpeg-8c/makejmak.vc6 @@ -0,0 +1,425 @@ +# Microsoft Developer Studio Generated NMAKE File, Based on jpeg.dsp +!IF "$(CFG)" == "" +CFG=jpeg - Win32 +!MESSAGE Keine Konfiguration angegeben. jpeg - Win32 wird als Standard verwendet. +!ENDIF + +!IF "$(CFG)" != "jpeg - Win32" +!MESSAGE Ungltige Konfiguration "$(CFG)" angegeben. +!MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben +!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: +!MESSAGE +!MESSAGE NMAKE /f "jpeg.mak" CFG="jpeg - Win32" +!MESSAGE +!MESSAGE Fr die Konfiguration stehen zur Auswahl: +!MESSAGE +!MESSAGE "jpeg - Win32" (basierend auf "Win32 (x86) Static Library") +!MESSAGE +!ERROR Eine ungltige Konfiguration wurde angegeben. +!ENDIF + +!IF "$(OS)" == "Windows_NT" +NULL= +!ELSE +NULL=nul +!ENDIF + +OUTDIR=.\Release +INTDIR=.\Release +# Begin Custom Macros +OutDir=.\Release +# End Custom Macros + +ALL : "$(OUTDIR)\jpeg.lib" + + +CLEAN : + -@erase "$(INTDIR)\jaricom.obj" + -@erase "$(INTDIR)\jcapimin.obj" + -@erase "$(INTDIR)\jcapistd.obj" + -@erase "$(INTDIR)\jcarith.obj" + -@erase "$(INTDIR)\jccoefct.obj" + -@erase "$(INTDIR)\jccolor.obj" + -@erase "$(INTDIR)\jcdctmgr.obj" + -@erase "$(INTDIR)\jchuff.obj" + -@erase "$(INTDIR)\jcinit.obj" + -@erase "$(INTDIR)\jcmainct.obj" + -@erase "$(INTDIR)\jcmarker.obj" + -@erase "$(INTDIR)\jcmaster.obj" + -@erase "$(INTDIR)\jcomapi.obj" + -@erase "$(INTDIR)\jcparam.obj" + -@erase "$(INTDIR)\jcprepct.obj" + -@erase "$(INTDIR)\jcsample.obj" + -@erase "$(INTDIR)\jctrans.obj" + -@erase "$(INTDIR)\jdapimin.obj" + -@erase "$(INTDIR)\jdapistd.obj" + -@erase "$(INTDIR)\jdarith.obj" + -@erase "$(INTDIR)\jdatadst.obj" + -@erase "$(INTDIR)\jdatasrc.obj" + -@erase "$(INTDIR)\jdcoefct.obj" + -@erase "$(INTDIR)\jdcolor.obj" + -@erase "$(INTDIR)\jddctmgr.obj" + -@erase "$(INTDIR)\jdhuff.obj" + -@erase "$(INTDIR)\jdinput.obj" + -@erase "$(INTDIR)\jdmainct.obj" + -@erase "$(INTDIR)\jdmarker.obj" + -@erase "$(INTDIR)\jdmaster.obj" + -@erase "$(INTDIR)\jdmerge.obj" + -@erase "$(INTDIR)\jdpostct.obj" + -@erase "$(INTDIR)\jdsample.obj" + -@erase "$(INTDIR)\jdtrans.obj" + -@erase "$(INTDIR)\jerror.obj" + -@erase "$(INTDIR)\jfdctflt.obj" + -@erase "$(INTDIR)\jfdctfst.obj" + -@erase "$(INTDIR)\jfdctint.obj" + -@erase "$(INTDIR)\jidctflt.obj" + -@erase "$(INTDIR)\jidctfst.obj" + -@erase "$(INTDIR)\jidctint.obj" + -@erase "$(INTDIR)\jmemmgr.obj" + -@erase "$(INTDIR)\jmemnobs.obj" + -@erase "$(INTDIR)\jquant1.obj" + -@erase "$(INTDIR)\jquant2.obj" + -@erase "$(INTDIR)\jutils.obj" + -@erase "$(INTDIR)\vc60.idb" + -@erase "$(OUTDIR)\jpeg.lib" + +"$(OUTDIR)" : + if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + +CPP=cl.exe +CPP_PROJ=/nologo /G6 /MT /W3 /GX /Ox /Oa /Ob2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /Fp"$(INTDIR)\jpeg.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c + +.c{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.c{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +RSC=rc.exe +BSC32=bscmake.exe +BSC32_FLAGS=/nologo /o"$(OUTDIR)\jpeg.bsc" +BSC32_SBRS= \ + +LIB32=link.exe -lib +LIB32_FLAGS=/nologo /out:"$(OUTDIR)\jpeg.lib" +LIB32_OBJS= \ + "$(INTDIR)\jaricom.obj" \ + "$(INTDIR)\jcapimin.obj" \ + "$(INTDIR)\jcapistd.obj" \ + "$(INTDIR)\jcarith.obj" \ + "$(INTDIR)\jccoefct.obj" \ + "$(INTDIR)\jccolor.obj" \ + "$(INTDIR)\jcdctmgr.obj" \ + "$(INTDIR)\jchuff.obj" \ + "$(INTDIR)\jcinit.obj" \ + "$(INTDIR)\jcmainct.obj" \ + "$(INTDIR)\jcmarker.obj" \ + "$(INTDIR)\jcmaster.obj" \ + "$(INTDIR)\jcomapi.obj" \ + "$(INTDIR)\jcparam.obj" \ + "$(INTDIR)\jcprepct.obj" \ + "$(INTDIR)\jcsample.obj" \ + "$(INTDIR)\jctrans.obj" \ + "$(INTDIR)\jdapimin.obj" \ + "$(INTDIR)\jdapistd.obj" \ + "$(INTDIR)\jdarith.obj" \ + "$(INTDIR)\jdatadst.obj" \ + "$(INTDIR)\jdatasrc.obj" \ + "$(INTDIR)\jdcoefct.obj" \ + "$(INTDIR)\jdcolor.obj" \ + "$(INTDIR)\jddctmgr.obj" \ + "$(INTDIR)\jdhuff.obj" \ + "$(INTDIR)\jdinput.obj" \ + "$(INTDIR)\jdmainct.obj" \ + "$(INTDIR)\jdmarker.obj" \ + "$(INTDIR)\jdmaster.obj" \ + "$(INTDIR)\jdmerge.obj" \ + "$(INTDIR)\jdpostct.obj" \ + "$(INTDIR)\jdsample.obj" \ + "$(INTDIR)\jdtrans.obj" \ + "$(INTDIR)\jerror.obj" \ + "$(INTDIR)\jfdctflt.obj" \ + "$(INTDIR)\jfdctfst.obj" \ + "$(INTDIR)\jfdctint.obj" \ + "$(INTDIR)\jidctflt.obj" \ + "$(INTDIR)\jidctfst.obj" \ + "$(INTDIR)\jidctint.obj" \ + "$(INTDIR)\jmemmgr.obj" \ + "$(INTDIR)\jmemnobs.obj" \ + "$(INTDIR)\jquant1.obj" \ + "$(INTDIR)\jquant2.obj" \ + "$(INTDIR)\jutils.obj" + +"$(OUTDIR)\jpeg.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) + $(LIB32) @<< + $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) +<< + + +!IF "$(NO_EXTERNAL_DEPS)" != "1" +!IF EXISTS("jpeg.dep") +!INCLUDE "jpeg.dep" +!ELSE +!MESSAGE Warning: cannot find "jpeg.dep" +!ENDIF +!ENDIF + + +!IF "$(CFG)" == "jpeg - Win32" +SOURCE=.\jaricom.c + +"$(INTDIR)\jaricom.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jcapimin.c + +"$(INTDIR)\jcapimin.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jcapistd.c + +"$(INTDIR)\jcapistd.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jcarith.c + +"$(INTDIR)\jcarith.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jccoefct.c + +"$(INTDIR)\jccoefct.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jccolor.c + +"$(INTDIR)\jccolor.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jcdctmgr.c + +"$(INTDIR)\jcdctmgr.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jchuff.c + +"$(INTDIR)\jchuff.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jcinit.c + +"$(INTDIR)\jcinit.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jcmainct.c + +"$(INTDIR)\jcmainct.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jcmarker.c + +"$(INTDIR)\jcmarker.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jcmaster.c + +"$(INTDIR)\jcmaster.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jcomapi.c + +"$(INTDIR)\jcomapi.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jcparam.c + +"$(INTDIR)\jcparam.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jcprepct.c + +"$(INTDIR)\jcprepct.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jcsample.c + +"$(INTDIR)\jcsample.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jctrans.c + +"$(INTDIR)\jctrans.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdapimin.c + +"$(INTDIR)\jdapimin.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdapistd.c + +"$(INTDIR)\jdapistd.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdarith.c + +"$(INTDIR)\jdarith.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdatadst.c + +"$(INTDIR)\jdatadst.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdatasrc.c + +"$(INTDIR)\jdatasrc.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdcoefct.c + +"$(INTDIR)\jdcoefct.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdcolor.c + +"$(INTDIR)\jdcolor.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jddctmgr.c + +"$(INTDIR)\jddctmgr.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdhuff.c + +"$(INTDIR)\jdhuff.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdinput.c + +"$(INTDIR)\jdinput.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdmainct.c + +"$(INTDIR)\jdmainct.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdmarker.c + +"$(INTDIR)\jdmarker.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdmaster.c + +"$(INTDIR)\jdmaster.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdmerge.c + +"$(INTDIR)\jdmerge.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdpostct.c + +"$(INTDIR)\jdpostct.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdsample.c + +"$(INTDIR)\jdsample.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jdtrans.c + +"$(INTDIR)\jdtrans.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jerror.c + +"$(INTDIR)\jerror.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jfdctflt.c + +"$(INTDIR)\jfdctflt.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jfdctfst.c + +"$(INTDIR)\jfdctfst.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jfdctint.c + +"$(INTDIR)\jfdctint.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jidctflt.c + +"$(INTDIR)\jidctflt.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jidctfst.c + +"$(INTDIR)\jidctfst.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jidctint.c + +"$(INTDIR)\jidctint.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jmemmgr.c + +"$(INTDIR)\jmemmgr.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jmemnobs.c + +"$(INTDIR)\jmemnobs.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jquant1.c + +"$(INTDIR)\jquant1.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jquant2.c + +"$(INTDIR)\jquant2.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jutils.c + +"$(INTDIR)\jutils.obj" : $(SOURCE) "$(INTDIR)" + + + +!ENDIF + diff --git a/jpeg-8c/makejsln.v10 b/jpeg-8c/makejsln.v10 new file mode 100644 index 00000000..6a5befdf --- /dev/null +++ b/jpeg-8c/makejsln.v10 @@ -0,0 +1,17 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual C++ Express 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpeg", "jpeg.vcxproj", "{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Win32.ActiveCfg = Release|Win32 + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/jpeg-8c/makejvcx.v10 b/jpeg-8c/makejvcx.v10 new file mode 100644 index 00000000..ccee2878 --- /dev/null +++ b/jpeg-8c/makejvcx.v10 @@ -0,0 +1,112 @@ + + + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Disabled + false + + + + + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1} + Win32Proj + jpeg + + + + StaticLibrary + false + true + Unicode + + + + + + + + + + + + Level3 + NotUsing + Full + true + false + WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS + true + true + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/jpeg-8c/makeproj.mac b/jpeg-8c/makeproj.mac new file mode 100644 index 00000000..e5b51023 --- /dev/null +++ b/jpeg-8c/makeproj.mac @@ -0,0 +1,213 @@ +-- +-- makeproj.mac +-- +-- This AppleScript builds Code Warrior PRO Release 2 project files for the +-- libjpeg library as well as the test programs 'cjpeg', 'djpeg', 'jpegtran'. +-- (We'd distribute real project files, except they're not text +-- and would create maintenance headaches.) +-- +-- The script then compiles and links the library and the test programs. +-- NOTE: if you haven't already created a 'jconfig.h' file, the script +-- automatically copies 'jconfig.mac' to 'jconfig.h'. +-- +-- To use this script, you must have AppleScript 1.1 or later installed +-- and a suitable AppleScript editor like Script Editor or Script Debugger +-- (http://www.latenightsw.com). Open this file with your AppleScript +-- editor and execute the "run" command to build the projects. +-- +-- Thanks to Dan Sears and Don Agro for this script. +-- Questions about this script can be addressed to dogpark@interlog.com +-- + +on run + + choose folder with prompt ">>> Select IJG source folder <<<" + set ijg_folder to result + + choose folder with prompt ">>> Select MetroWerks folder <<<" + set cw_folder to result + + -- if jconfig.h doesn't already exist, copy jconfig.mac + + tell application "Finder" + if not (exists file "jconfig.h" of ijg_folder) then + duplicate {file "jconfig.mac" of folder ijg_folder} + select file "jconfig.mac copy" of folder ijg_folder + set name of selection to "jconfig.h" + end if + end tell + + tell application "CodeWarrior IDE 2.1" + with timeout of 10000 seconds + + -- create libjpeg project + + activate + Create Project (ijg_folder as string) & "libjpeg.proj" + Set Preferences of panel "Target Settings" to {Target Name:"libjpeg"} + Set Preferences of panel "PPC Project" to {File Name:"libjpeg"} + Set Preferences of panel "Target Settings" to {Linker:"MacOS PPC Linker"} + Set Preferences of panel "PPC Project" to {Project Type:library} + Set Preferences of panel "C/C++ Compiler" to {ANSI Strict:true} + Set Preferences of panel "C/C++ Compiler" to {Enums Always Ints:true} + Set Preferences of panel "PPC Codegen" to {Struct Alignment:PowerPC} + Set Preferences of panel "PPC Linker" to {Generate SYM File:false} + + Add Files (ijg_folder as string) & "jaricom.c" To Segment 1 + Add Files (ijg_folder as string) & "jcapimin.c" To Segment 1 + Add Files (ijg_folder as string) & "jcapistd.c" To Segment 1 + Add Files (ijg_folder as string) & "jcarith.c" To Segment 1 + Add Files (ijg_folder as string) & "jctrans.c" To Segment 1 + Add Files (ijg_folder as string) & "jcparam.c" To Segment 1 + Add Files (ijg_folder as string) & "jdatadst.c" To Segment 1 + Add Files (ijg_folder as string) & "jcinit.c" To Segment 1 + Add Files (ijg_folder as string) & "jcmaster.c" To Segment 1 + Add Files (ijg_folder as string) & "jcmarker.c" To Segment 1 + Add Files (ijg_folder as string) & "jcmainct.c" To Segment 1 + Add Files (ijg_folder as string) & "jcprepct.c" To Segment 1 + Add Files (ijg_folder as string) & "jccoefct.c" To Segment 1 + Add Files (ijg_folder as string) & "jccolor.c" To Segment 1 + Add Files (ijg_folder as string) & "jcsample.c" To Segment 1 + Add Files (ijg_folder as string) & "jchuff.c" To Segment 1 + Add Files (ijg_folder as string) & "jcdctmgr.c" To Segment 1 + Add Files (ijg_folder as string) & "jfdctfst.c" To Segment 1 + Add Files (ijg_folder as string) & "jfdctflt.c" To Segment 1 + Add Files (ijg_folder as string) & "jfdctint.c" To Segment 1 + Add Files (ijg_folder as string) & "jdapimin.c" To Segment 1 + Add Files (ijg_folder as string) & "jdapistd.c" To Segment 1 + Add Files (ijg_folder as string) & "jdarith.c" To Segment 1 + Add Files (ijg_folder as string) & "jdtrans.c" To Segment 1 + Add Files (ijg_folder as string) & "jdatasrc.c" To Segment 1 + Add Files (ijg_folder as string) & "jdmaster.c" To Segment 1 + Add Files (ijg_folder as string) & "jdinput.c" To Segment 1 + Add Files (ijg_folder as string) & "jdmarker.c" To Segment 1 + Add Files (ijg_folder as string) & "jdhuff.c" To Segment 1 + Add Files (ijg_folder as string) & "jdmainct.c" To Segment 1 + Add Files (ijg_folder as string) & "jdcoefct.c" To Segment 1 + Add Files (ijg_folder as string) & "jdpostct.c" To Segment 1 + Add Files (ijg_folder as string) & "jddctmgr.c" To Segment 1 + Add Files (ijg_folder as string) & "jidctfst.c" To Segment 1 + Add Files (ijg_folder as string) & "jidctflt.c" To Segment 1 + Add Files (ijg_folder as string) & "jidctint.c" To Segment 1 + Add Files (ijg_folder as string) & "jdsample.c" To Segment 1 + Add Files (ijg_folder as string) & "jdcolor.c" To Segment 1 + Add Files (ijg_folder as string) & "jquant1.c" To Segment 1 + Add Files (ijg_folder as string) & "jquant2.c" To Segment 1 + Add Files (ijg_folder as string) & "jdmerge.c" To Segment 1 + Add Files (ijg_folder as string) & "jcomapi.c" To Segment 1 + Add Files (ijg_folder as string) & "jutils.c" To Segment 1 + Add Files (ijg_folder as string) & "jerror.c" To Segment 1 + Add Files (ijg_folder as string) & "jmemmgr.c" To Segment 1 + Add Files (ijg_folder as string) & "jmemmac.c" To Segment 1 + + -- compile and link the library + + Make Project + Close Project + + -- create cjpeg project + + activate + Create Project (ijg_folder as string) & "cjpeg.proj" + Set Preferences of panel "Target Settings" to {Target Name:"cjpeg"} + Set Preferences of panel "PPC Project" to {File Name:"cjpeg"} + Set Preferences of panel "Target Settings" to {Linker:"MacOS PPC Linker"} + Set Preferences of panel "C/C++ Compiler" to {ANSI Strict:true} + Set Preferences of panel "C/C++ Compiler" to {Enums Always Ints:true} + Set Preferences of panel "PPC Codegen" to {Struct Alignment:PowerPC} + Set Preferences of panel "PPC Linker" to {Generate SYM File:false} + + Add Files (ijg_folder as string) & "cjpeg.c" To Segment 1 + Add Files (ijg_folder as string) & "rdppm.c" To Segment 1 + Add Files (ijg_folder as string) & "rdgif.c" To Segment 1 + Add Files (ijg_folder as string) & "rdtarga.c" To Segment 1 + Add Files (ijg_folder as string) & "rdrle.c" To Segment 1 + Add Files (ijg_folder as string) & "rdbmp.c" To Segment 1 + Add Files (ijg_folder as string) & "rdswitch.c" To Segment 1 + Add Files (ijg_folder as string) & "cdjpeg.c" To Segment 1 + + Add Files (ijg_folder as string) & "libjpeg" To Segment 2 + + Add Files (cw_folder as string) & "Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C:Bin:MSL C.PPC.Lib" To Segment 3 + Add Files (cw_folder as string) & "Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C:Bin:MSL SIOUX.PPC.Lib" To Segment 3 + Add Files (cw_folder as string) & "Metrowerks CodeWarrior:MacOS Support:Libraries:Runtime:Runtime PPC:MSL RuntimePPC.Lib" To Segment 3 + + Add Files (cw_folder as string) & "Metrowerks CodeWarrior:MacOS Support:Libraries:MacOS Common:InterfaceLib" To Segment 4 + Add Files (cw_folder as string) & "Metrowerks CodeWarrior:MacOS Support:Libraries:MacOS Common:MathLib" To Segment 4 + + -- compile and link cjpeg + + Make Project + Close Project + + -- create djpeg project + + activate + Create Project (ijg_folder as string) & "djpeg.proj" + Set Preferences of panel "Target Settings" to {Target Name:"djpeg"} + Set Preferences of panel "PPC Project" to {File Name:"djpeg"} + Set Preferences of panel "Target Settings" to {Linker:"MacOS PPC Linker"} + Set Preferences of panel "C/C++ Compiler" to {ANSI Strict:true} + Set Preferences of panel "C/C++ Compiler" to {Enums Always Ints:true} + Set Preferences of panel "PPC Codegen" to {Struct Alignment:PowerPC} + Set Preferences of panel "PPC Linker" to {Generate SYM File:false} + + Add Files (ijg_folder as string) & "djpeg.c" To Segment 1 + Add Files (ijg_folder as string) & "wrppm.c" To Segment 1 + Add Files (ijg_folder as string) & "wrgif.c" To Segment 1 + Add Files (ijg_folder as string) & "wrtarga.c" To Segment 1 + Add Files (ijg_folder as string) & "wrrle.c" To Segment 1 + Add Files (ijg_folder as string) & "wrbmp.c" To Segment 1 + Add Files (ijg_folder as string) & "rdcolmap.c" To Segment 1 + Add Files (ijg_folder as string) & "cdjpeg.c" To Segment 1 + + Add Files (ijg_folder as string) & "libjpeg" To Segment 2 + + Add Files (cw_folder as string) & "Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C:Bin:MSL C.PPC.Lib" To Segment 3 + Add Files (cw_folder as string) & "Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C:Bin:MSL SIOUX.PPC.Lib" To Segment 3 + Add Files (cw_folder as string) & "Metrowerks CodeWarrior:MacOS Support:Libraries:Runtime:Runtime PPC:MSL RuntimePPC.Lib" To Segment 3 + + Add Files (cw_folder as string) & "Metrowerks CodeWarrior:MacOS Support:Libraries:MacOS Common:InterfaceLib" To Segment 4 + Add Files (cw_folder as string) & "Metrowerks CodeWarrior:MacOS Support:Libraries:MacOS Common:MathLib" To Segment 4 + + -- compile and link djpeg + + Make Project + Close Project + + -- create jpegtran project + + activate + Create Project (ijg_folder as string) & "jpegtran.proj" + Set Preferences of panel "Target Settings" to {Target Name:"jpegtran"} + Set Preferences of panel "PPC Project" to {File Name:"jpegtran"} + Set Preferences of panel "Target Settings" to {Linker:"MacOS PPC Linker"} + Set Preferences of panel "C/C++ Compiler" to {ANSI Strict:true} + Set Preferences of panel "C/C++ Compiler" to {Enums Always Ints:true} + Set Preferences of panel "PPC Codegen" to {Struct Alignment:PowerPC} + Set Preferences of panel "PPC Linker" to {Generate SYM File:false} + + Add Files (ijg_folder as string) & "jpegtran.c" To Segment 1 + Add Files (ijg_folder as string) & "rdswitch.c" To Segment 1 + Add Files (ijg_folder as string) & "cdjpeg.c" To Segment 1 + Add Files (ijg_folder as string) & "transupp.c" To Segment 1 + + Add Files (ijg_folder as string) & "libjpeg" To Segment 2 + + Add Files (cw_folder as string) & "Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C:Bin:MSL C.PPC.Lib" To Segment 3 + Add Files (cw_folder as string) & "Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C:Bin:MSL SIOUX.PPC.Lib" To Segment 3 + Add Files (cw_folder as string) & "Metrowerks CodeWarrior:MacOS Support:Libraries:Runtime:Runtime PPC:MSL RuntimePPC.Lib" To Segment 3 + + Add Files (cw_folder as string) & "Metrowerks CodeWarrior:MacOS Support:Libraries:MacOS Common:InterfaceLib" To Segment 4 + Add Files (cw_folder as string) & "Metrowerks CodeWarrior:MacOS Support:Libraries:MacOS Common:MathLib" To Segment 4 + + -- compile and link jpegtran + + Make Project + Close Project + + quit + + end timeout + end tell +end run diff --git a/jpeg-8c/makerdep.vc6 b/jpeg-8c/makerdep.vc6 new file mode 100644 index 00000000..94748d01 --- /dev/null +++ b/jpeg-8c/makerdep.vc6 @@ -0,0 +1,6 @@ +# Microsoft Developer Studio erstellte Abhngigkeitsdatei, einbezogen von rdjpgcom.mak + +.\rdjpgcom.c : \ + ".\jconfig.h"\ + ".\jinclude.h"\ + diff --git a/jpeg-8c/makerdsp.vc6 b/jpeg-8c/makerdsp.vc6 new file mode 100644 index 00000000..60de09af --- /dev/null +++ b/jpeg-8c/makerdsp.vc6 @@ -0,0 +1,78 @@ +# Microsoft Developer Studio Project File - Name="rdjpgcom" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** NICHT BEARBEITEN ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=rdjpgcom - Win32 +!MESSAGE Dies ist kein gltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE +!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und fhren Sie den Befehl +!MESSAGE +!MESSAGE NMAKE /f "rdjpgcom.mak". +!MESSAGE +!MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben +!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: +!MESSAGE +!MESSAGE NMAKE /f "rdjpgcom.mak" CFG="rdjpgcom - Win32" +!MESSAGE +!MESSAGE Fr die Konfiguration stehen zur Auswahl: +!MESSAGE +!MESSAGE "rdjpgcom - Win32" (basierend auf "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir ".\rdjpgcom\Release" +# PROP BASE Intermediate_Dir ".\rdjpgcom\Release" +# PROP BASE Target_Dir ".\rdjpgcom" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir ".\rdjpgcom\Release" +# PROP Intermediate_Dir ".\rdjpgcom\Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir ".\rdjpgcom" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c +# ADD CPP /nologo /G6 /MT /W3 /GX /Ox /Oa /Ob2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 Release\jpeg.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# Begin Target + +# Name "rdjpgcom - Win32" +# Begin Group "Quellcodedateien" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\rdjpgcom.c +# End Source File +# End Group +# Begin Group "Header-Dateien" + +# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" +# Begin Source File + +SOURCE=.\jconfig.h +# End Source File +# Begin Source File + +SOURCE=.\jinclude.h +# End Source File +# End Group +# Begin Group "Ressourcendateien" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/jpeg-8c/makerfil.v10 b/jpeg-8c/makerfil.v10 new file mode 100644 index 00000000..d14914af --- /dev/null +++ b/jpeg-8c/makerfil.v10 @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + + + Source Files + + + \ No newline at end of file diff --git a/jpeg-8c/makermak.vc6 b/jpeg-8c/makermak.vc6 new file mode 100644 index 00000000..6d2d4c73 --- /dev/null +++ b/jpeg-8c/makermak.vc6 @@ -0,0 +1,110 @@ +# Microsoft Developer Studio Generated NMAKE File, Based on rdjpgcom.dsp +!IF "$(CFG)" == "" +CFG=rdjpgcom - Win32 +!MESSAGE Keine Konfiguration angegeben. rdjpgcom - Win32 wird als Standard verwendet. +!ENDIF + +!IF "$(CFG)" != "rdjpgcom - Win32" +!MESSAGE Ungltige Konfiguration "$(CFG)" angegeben. +!MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben +!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: +!MESSAGE +!MESSAGE NMAKE /f "rdjpgcom.mak" CFG="rdjpgcom - Win32" +!MESSAGE +!MESSAGE Fr die Konfiguration stehen zur Auswahl: +!MESSAGE +!MESSAGE "rdjpgcom - Win32" (basierend auf "Win32 (x86) Console Application") +!MESSAGE +!ERROR Eine ungltige Konfiguration wurde angegeben. +!ENDIF + +!IF "$(OS)" == "Windows_NT" +NULL= +!ELSE +NULL=nul +!ENDIF + +CPP=cl.exe +RSC=rc.exe +OUTDIR=.\rdjpgcom\Release +INTDIR=.\rdjpgcom\Release +# Begin Custom Macros +OutDir=.\rdjpgcom\Release +# End Custom Macros + +ALL : "$(OUTDIR)\rdjpgcom.exe" + + +CLEAN : + -@erase "$(INTDIR)\rdjpgcom.obj" + -@erase "$(INTDIR)\vc60.idb" + -@erase "$(OUTDIR)\rdjpgcom.exe" + +"$(OUTDIR)" : + if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + +BSC32=bscmake.exe +BSC32_FLAGS=/nologo /o"$(OUTDIR)\rdjpgcom.bsc" +BSC32_SBRS= \ + +LINK32=link.exe +LINK32_FLAGS=Release\jpeg.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\rdjpgcom.pdb" /machine:I386 /out:"$(OUTDIR)\rdjpgcom.exe" +LINK32_OBJS= \ + "$(INTDIR)\rdjpgcom.obj" + +"$(OUTDIR)\rdjpgcom.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) + $(LINK32) @<< + $(LINK32_FLAGS) $(LINK32_OBJS) +<< + +CPP_PROJ=/nologo /G6 /MT /W3 /GX /Ox /Oa /Ob2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /Fp"$(INTDIR)\rdjpgcom.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c + +.c{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.c{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + + +!IF "$(NO_EXTERNAL_DEPS)" != "1" +!IF EXISTS("rdjpgcom.dep") +!INCLUDE "rdjpgcom.dep" +!ELSE +!MESSAGE Warning: cannot find "rdjpgcom.dep" +!ENDIF +!ENDIF + + +!IF "$(CFG)" == "rdjpgcom - Win32" +SOURCE=.\rdjpgcom.c + +"$(INTDIR)\rdjpgcom.obj" : $(SOURCE) "$(INTDIR)" + + + +!ENDIF + diff --git a/jpeg-8c/makervcx.v10 b/jpeg-8c/makervcx.v10 new file mode 100644 index 00000000..366d4fcb --- /dev/null +++ b/jpeg-8c/makervcx.v10 @@ -0,0 +1,62 @@ + + + + + Release + Win32 + + + + {C81513DB-78DC-46BC-BC98-82E745203976} + Win32Proj + rdjpgcom + + + + Application + false + true + Unicode + + + + + + + + + + false + $(ProjectName)\$(Configuration)\ + $(ProjectName)\$(Configuration)\ + + + + Level3 + NotUsing + Full + true + false + WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS + true + true + 4996 + + + Console + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/jpeg-8c/maketdep.vc6 b/jpeg-8c/maketdep.vc6 new file mode 100644 index 00000000..e177ecbf --- /dev/null +++ b/jpeg-8c/maketdep.vc6 @@ -0,0 +1,43 @@ +# Microsoft Developer Studio erstellte Abhngigkeitsdatei, einbezogen von jpegtran.mak + +.\cdjpeg.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\jpegtran.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + ".\jversion.h"\ + ".\transupp.h"\ + + +.\rdswitch.c : \ + ".\cderror.h"\ + ".\cdjpeg.h"\ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpeglib.h"\ + + +.\transupp.c : \ + ".\jconfig.h"\ + ".\jerror.h"\ + ".\jinclude.h"\ + ".\jmorecfg.h"\ + ".\jpegint.h"\ + ".\jpeglib.h"\ + ".\transupp.h"\ + diff --git a/jpeg-8c/maketdsp.vc6 b/jpeg-8c/maketdsp.vc6 new file mode 100644 index 00000000..fe1ae9a3 --- /dev/null +++ b/jpeg-8c/maketdsp.vc6 @@ -0,0 +1,122 @@ +# Microsoft Developer Studio Project File - Name="jpegtran" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** NICHT BEARBEITEN ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=jpegtran - Win32 +!MESSAGE Dies ist kein gltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE +!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und fhren Sie den Befehl +!MESSAGE +!MESSAGE NMAKE /f "jpegtran.mak". +!MESSAGE +!MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben +!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: +!MESSAGE +!MESSAGE NMAKE /f "jpegtran.mak" CFG="jpegtran - Win32" +!MESSAGE +!MESSAGE Fr die Konfiguration stehen zur Auswahl: +!MESSAGE +!MESSAGE "jpegtran - Win32" (basierend auf "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir ".\jpegtran\Release" +# PROP BASE Intermediate_Dir ".\jpegtran\Release" +# PROP BASE Target_Dir ".\jpegtran" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir ".\jpegtran\Release" +# PROP Intermediate_Dir ".\jpegtran\Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir ".\jpegtran" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c +# ADD CPP /nologo /G6 /MT /W3 /GX /Ox /Oa /Ob2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 Release\jpeg.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# Begin Target + +# Name "jpegtran - Win32" +# Begin Group "Quellcodedateien" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\cdjpeg.c +# End Source File +# Begin Source File + +SOURCE=.\jpegtran.c +# End Source File +# Begin Source File + +SOURCE=.\rdswitch.c +# End Source File +# Begin Source File + +SOURCE=.\transupp.c +# End Source File +# End Group +# Begin Group "Header-Dateien" + +# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" +# Begin Source File + +SOURCE=.\cderror.h +# End Source File +# Begin Source File + +SOURCE=.\cdjpeg.h +# End Source File +# Begin Source File + +SOURCE=.\jconfig.h +# End Source File +# Begin Source File + +SOURCE=.\jerror.h +# End Source File +# Begin Source File + +SOURCE=.\jinclude.h +# End Source File +# Begin Source File + +SOURCE=.\jmorecfg.h +# End Source File +# Begin Source File + +SOURCE=.\jpegint.h +# End Source File +# Begin Source File + +SOURCE=.\jpeglib.h +# End Source File +# Begin Source File + +SOURCE=.\jversion.h +# End Source File +# Begin Source File + +SOURCE=.\transupp.h +# End Source File +# End Group +# Begin Group "Ressourcendateien" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/jpeg-8c/maketfil.v10 b/jpeg-8c/maketfil.v10 new file mode 100644 index 00000000..fae00941 --- /dev/null +++ b/jpeg-8c/maketfil.v10 @@ -0,0 +1,63 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/jpeg-8c/maketmak.vc6 b/jpeg-8c/maketmak.vc6 new file mode 100644 index 00000000..a0de38c0 --- /dev/null +++ b/jpeg-8c/maketmak.vc6 @@ -0,0 +1,131 @@ +# Microsoft Developer Studio Generated NMAKE File, Based on jpegtran.dsp +!IF "$(CFG)" == "" +CFG=jpegtran - Win32 +!MESSAGE Keine Konfiguration angegeben. jpegtran - Win32 wird als Standard verwendet. +!ENDIF + +!IF "$(CFG)" != "jpegtran - Win32" +!MESSAGE Ungltige Konfiguration "$(CFG)" angegeben. +!MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben +!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: +!MESSAGE +!MESSAGE NMAKE /f "jpegtran.mak" CFG="jpegtran - Win32" +!MESSAGE +!MESSAGE Fr die Konfiguration stehen zur Auswahl: +!MESSAGE +!MESSAGE "jpegtran - Win32" (basierend auf "Win32 (x86) Console Application") +!MESSAGE +!ERROR Eine ungltige Konfiguration wurde angegeben. +!ENDIF + +!IF "$(OS)" == "Windows_NT" +NULL= +!ELSE +NULL=nul +!ENDIF + +CPP=cl.exe +RSC=rc.exe +OUTDIR=.\jpegtran\Release +INTDIR=.\jpegtran\Release +# Begin Custom Macros +OutDir=.\jpegtran\Release +# End Custom Macros + +ALL : "$(OUTDIR)\jpegtran.exe" + + +CLEAN : + -@erase "$(INTDIR)\cdjpeg.obj" + -@erase "$(INTDIR)\jpegtran.obj" + -@erase "$(INTDIR)\rdswitch.obj" + -@erase "$(INTDIR)\transupp.obj" + -@erase "$(INTDIR)\vc60.idb" + -@erase "$(OUTDIR)\jpegtran.exe" + +"$(OUTDIR)" : + if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + +BSC32=bscmake.exe +BSC32_FLAGS=/nologo /o"$(OUTDIR)\jpegtran.bsc" +BSC32_SBRS= \ + +LINK32=link.exe +LINK32_FLAGS=Release\jpeg.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\jpegtran.pdb" /machine:I386 /out:"$(OUTDIR)\jpegtran.exe" +LINK32_OBJS= \ + "$(INTDIR)\cdjpeg.obj" \ + "$(INTDIR)\jpegtran.obj" \ + "$(INTDIR)\rdswitch.obj" \ + "$(INTDIR)\transupp.obj" + +"$(OUTDIR)\jpegtran.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) + $(LINK32) @<< + $(LINK32_FLAGS) $(LINK32_OBJS) +<< + +CPP_PROJ=/nologo /G6 /MT /W3 /GX /Ox /Oa /Ob2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /Fp"$(INTDIR)\jpegtran.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c + +.c{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.c{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + + +!IF "$(NO_EXTERNAL_DEPS)" != "1" +!IF EXISTS("jpegtran.dep") +!INCLUDE "jpegtran.dep" +!ELSE +!MESSAGE Warning: cannot find "jpegtran.dep" +!ENDIF +!ENDIF + + +!IF "$(CFG)" == "jpegtran - Win32" +SOURCE=.\cdjpeg.c + +"$(INTDIR)\cdjpeg.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\jpegtran.c + +"$(INTDIR)\jpegtran.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\rdswitch.c + +"$(INTDIR)\rdswitch.obj" : $(SOURCE) "$(INTDIR)" + + +SOURCE=.\transupp.c + +"$(INTDIR)\transupp.obj" : $(SOURCE) "$(INTDIR)" + + + +!ENDIF + diff --git a/jpeg-8c/maketvcx.v10 b/jpeg-8c/maketvcx.v10 new file mode 100644 index 00000000..e2b4ea36 --- /dev/null +++ b/jpeg-8c/maketvcx.v10 @@ -0,0 +1,74 @@ + + + + + Release + Win32 + + + + {025BAC50-51B5-4FFE-BC47-3F920BB4047E} + Win32Proj + jpegtran + + + + Application + false + true + Unicode + + + + + + + + + + false + $(ProjectName)\$(Configuration)\ + $(ProjectName)\$(Configuration)\ + + + + Level3 + NotUsing + Full + true + false + WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS + true + true + 4996 + + + Console + true + true + true + Release\jpeg.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jpeg-8c/makewdep.vc6 b/jpeg-8c/makewdep.vc6 new file mode 100644 index 00000000..15929bfe --- /dev/null +++ b/jpeg-8c/makewdep.vc6 @@ -0,0 +1,6 @@ +# Microsoft Developer Studio erstellte Abhngigkeitsdatei, einbezogen von wrjpgcom.mak + +.\wrjpgcom.c : \ + ".\jconfig.h"\ + ".\jinclude.h"\ + diff --git a/jpeg-8c/makewdsp.vc6 b/jpeg-8c/makewdsp.vc6 new file mode 100644 index 00000000..2063b1a5 --- /dev/null +++ b/jpeg-8c/makewdsp.vc6 @@ -0,0 +1,78 @@ +# Microsoft Developer Studio Project File - Name="wrjpgcom" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** NICHT BEARBEITEN ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=wrjpgcom - Win32 +!MESSAGE Dies ist kein gltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE +!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und fhren Sie den Befehl +!MESSAGE +!MESSAGE NMAKE /f "wrjpgcom.mak". +!MESSAGE +!MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben +!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: +!MESSAGE +!MESSAGE NMAKE /f "wrjpgcom.mak" CFG="wrjpgcom - Win32" +!MESSAGE +!MESSAGE Fr die Konfiguration stehen zur Auswahl: +!MESSAGE +!MESSAGE "wrjpgcom - Win32" (basierend auf "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir ".\wrjpgcom\Release" +# PROP BASE Intermediate_Dir ".\wrjpgcom\Release" +# PROP BASE Target_Dir ".\wrjpgcom" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir ".\wrjpgcom\Release" +# PROP Intermediate_Dir ".\wrjpgcom\Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir ".\wrjpgcom" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c +# ADD CPP /nologo /G6 /MT /W3 /GX /Ox /Oa /Ob2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 Release\jpeg.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# Begin Target + +# Name "wrjpgcom - Win32" +# Begin Group "Quellcodedateien" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\wrjpgcom.c +# End Source File +# End Group +# Begin Group "Header-Dateien" + +# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" +# Begin Source File + +SOURCE=.\jconfig.h +# End Source File +# Begin Source File + +SOURCE=.\jinclude.h +# End Source File +# End Group +# Begin Group "Ressourcendateien" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/jpeg-8c/makewfil.v10 b/jpeg-8c/makewfil.v10 new file mode 100644 index 00000000..72c58566 --- /dev/null +++ b/jpeg-8c/makewfil.v10 @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + + + Source Files + + + \ No newline at end of file diff --git a/jpeg-8c/makewmak.vc6 b/jpeg-8c/makewmak.vc6 new file mode 100644 index 00000000..22b90862 --- /dev/null +++ b/jpeg-8c/makewmak.vc6 @@ -0,0 +1,110 @@ +# Microsoft Developer Studio Generated NMAKE File, Based on wrjpgcom.dsp +!IF "$(CFG)" == "" +CFG=wrjpgcom - Win32 +!MESSAGE Keine Konfiguration angegeben. wrjpgcom - Win32 wird als Standard verwendet. +!ENDIF + +!IF "$(CFG)" != "wrjpgcom - Win32" +!MESSAGE Ungltige Konfiguration "$(CFG)" angegeben. +!MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben +!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: +!MESSAGE +!MESSAGE NMAKE /f "wrjpgcom.mak" CFG="wrjpgcom - Win32" +!MESSAGE +!MESSAGE Fr die Konfiguration stehen zur Auswahl: +!MESSAGE +!MESSAGE "wrjpgcom - Win32" (basierend auf "Win32 (x86) Console Application") +!MESSAGE +!ERROR Eine ungltige Konfiguration wurde angegeben. +!ENDIF + +!IF "$(OS)" == "Windows_NT" +NULL= +!ELSE +NULL=nul +!ENDIF + +CPP=cl.exe +RSC=rc.exe +OUTDIR=.\wrjpgcom\Release +INTDIR=.\wrjpgcom\Release +# Begin Custom Macros +OutDir=.\wrjpgcom\Release +# End Custom Macros + +ALL : "$(OUTDIR)\wrjpgcom.exe" + + +CLEAN : + -@erase "$(INTDIR)\vc60.idb" + -@erase "$(INTDIR)\wrjpgcom.obj" + -@erase "$(OUTDIR)\wrjpgcom.exe" + +"$(OUTDIR)" : + if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + +BSC32=bscmake.exe +BSC32_FLAGS=/nologo /o"$(OUTDIR)\wrjpgcom.bsc" +BSC32_SBRS= \ + +LINK32=link.exe +LINK32_FLAGS=Release\jpeg.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\wrjpgcom.pdb" /machine:I386 /out:"$(OUTDIR)\wrjpgcom.exe" +LINK32_OBJS= \ + "$(INTDIR)\wrjpgcom.obj" + +"$(OUTDIR)\wrjpgcom.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) + $(LINK32) @<< + $(LINK32_FLAGS) $(LINK32_OBJS) +<< + +CPP_PROJ=/nologo /G6 /MT /W3 /GX /Ox /Oa /Ob2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /Fp"$(INTDIR)\wrjpgcom.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c + +.c{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.c{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + + +!IF "$(NO_EXTERNAL_DEPS)" != "1" +!IF EXISTS("wrjpgcom.dep") +!INCLUDE "wrjpgcom.dep" +!ELSE +!MESSAGE Warning: cannot find "wrjpgcom.dep" +!ENDIF +!ENDIF + + +!IF "$(CFG)" == "wrjpgcom - Win32" +SOURCE=.\wrjpgcom.c + +"$(INTDIR)\wrjpgcom.obj" : $(SOURCE) "$(INTDIR)" + + + +!ENDIF + diff --git a/jpeg-8c/makewvcx.v10 b/jpeg-8c/makewvcx.v10 new file mode 100644 index 00000000..e6c546af --- /dev/null +++ b/jpeg-8c/makewvcx.v10 @@ -0,0 +1,62 @@ + + + + + Release + Win32 + + + + {B57065D4-DDDA-4668-BAF5-2D49270C973C} + Win32Proj + wrjpgcom + + + + Application + false + true + Unicode + + + + + + + + + + false + $(ProjectName)\$(Configuration)\ + $(ProjectName)\$(Configuration)\ + + + + Level3 + NotUsing + Full + true + false + WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS + true + true + 4996 + + + Console + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/jpeg-8c/makljpeg.st b/jpeg-8c/makljpeg.st new file mode 100644 index 00000000..cc1ba015 --- /dev/null +++ b/jpeg-8c/makljpeg.st @@ -0,0 +1,68 @@ +; Project file for Independent JPEG Group's software +; +; This project file is for Atari ST/STE/TT systems using Pure C or Turbo C. +; Thanks to Frank Moehle, B. Setzepfandt, and Guido Vollbeding. +; +; To use this file, rename it to libjpeg.prj. +; Read installation instructions before trying to make the program! +; +; +; * * * Output file * * * +libjpeg.lib +; +; * * * COMPILER OPTIONS * * * +.C[-P] ; absolute calls +.C[-M] ; and no string merging, folks +.C[-w-cln] ; no "constant is long" warnings +.C[-w-par] ; no "parameter xxxx unused" +.C[-w-rch] ; no "unreachable code" +.C[-wsig] ; warn if significant digits may be lost +.L[-J] ; link new Obj-format (so we get a library) += +; * * * * List of modules * * * * +jaricom.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jcapimin.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jcapistd.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jcarith.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jccoefct.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jccolor.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jcdctmgr.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h,jdct.h) +jchuff.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jcinit.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jcmainct.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jcmarker.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jcmaster.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jcomapi.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jcparam.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jcprepct.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jcsample.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jctrans.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jdapimin.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jdapistd.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jdarith.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jdatadst.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h) +jdatasrc.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h) +jdcoefct.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jdcolor.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jddctmgr.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h,jdct.h) +jdhuff.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jdinput.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jdmainct.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jdmarker.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jdmaster.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jdmerge.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jdpostct.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jdsample.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jdtrans.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jerror.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jversion.h,jerror.h) +jfdctflt.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h,jdct.h) +jfdctfst.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h,jdct.h) +jfdctint.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h,jdct.h) +jidctflt.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h,jdct.h) +jidctfst.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h,jdct.h) +jidctint.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h,jdct.h) +jquant1.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jquant2.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jutils.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h) +jmemmgr.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h,jmemsys.h) +jmemansi.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h,jmemsys.h) diff --git a/jpeg-8c/maktjpeg.st b/jpeg-8c/maktjpeg.st new file mode 100644 index 00000000..43f078a9 --- /dev/null +++ b/jpeg-8c/maktjpeg.st @@ -0,0 +1,30 @@ +; Project file for Independent JPEG Group's software +; +; This project file is for Atari ST/STE/TT systems using Pure C or Turbo C. +; Thanks to Frank Moehle, B. Setzepfandt, and Guido Vollbeding. +; +; To use this file, rename it to jpegtran.prj. +; If you are using Turbo C, change filenames beginning with "pc..." to "tc..." +; Read installation instructions before trying to make the program! +; +; +; * * * Output file * * * +jpegtran.ttp +; +; * * * COMPILER OPTIONS * * * +.C[-P] ; absolute calls +.C[-M] ; and no string merging, folks +.C[-w-cln] ; no "constant is long" warnings +.C[-w-par] ; no "parameter xxxx unused" +.C[-w-rch] ; no "unreachable code" +.C[-wsig] ; warn if significant digits may be lost += +; * * * * List of modules * * * * +pcstart.o +jpegtran.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h,transupp.h,jversion.h) +cdjpeg.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +rdswitch.c (cdjpeg.h,jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jerror.h,cderror.h) +transupp.c (jinclude.h,jconfig.h,jpeglib.h,jmorecfg.h,jpegint.h,jerror.h,transupp.h) +libjpeg.lib ; built by libjpeg.prj +pcstdlib.lib ; standard library +pcextlib.lib ; extended library diff --git a/jpeg-8c/makvms.opt b/jpeg-8c/makvms.opt new file mode 100644 index 00000000..675e8fe9 --- /dev/null +++ b/jpeg-8c/makvms.opt @@ -0,0 +1,4 @@ +! A pointer to the VAX/VMS C Run-Time Shareable Library. +! This file is needed by makefile.mms and makefile.vms, +! but only for the older VAX C compiler. DEC C does not need it. +Sys$Library:VAXCRTL.EXE /Share diff --git a/jpeg-8c/missing b/jpeg-8c/missing new file mode 100755 index 00000000..28055d2a --- /dev/null +++ b/jpeg-8c/missing @@ -0,0 +1,376 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + tar*) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar*) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/jpeg-8c/rdbmp.c b/jpeg-8c/rdbmp.c new file mode 100644 index 00000000..fd773d4b --- /dev/null +++ b/jpeg-8c/rdbmp.c @@ -0,0 +1,480 @@ +/* + * rdbmp.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2009-2010 by Guido Vollbeding. + * 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 read input images in Microsoft "BMP" + * format (MS Windows 3.x, OS/2 1.x, and OS/2 2.x flavors). + * Currently, only 8-bit and 24-bit images are supported, not 1-bit or + * 4-bit (feeding such low-depth images into JPEG would be silly anyway). + * Also, we don't support RLE-compressed files. + * + * These routines may need modification for non-Unix environments or + * specialized applications. As they stand, they assume input from + * an ordinary stdio stream. They further assume that reading begins + * at the start of the file; start_input may need work if the + * user interface has already read some data (e.g., to determine that + * the file is indeed BMP format). + * + * This code contributed by James Arthur Boucher. + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ + +#ifdef BMP_SUPPORTED + + +/* Macros to deal with unsigned chars as efficiently as compiler allows */ + +#ifdef HAVE_UNSIGNED_CHAR +typedef unsigned char U_CHAR; +#define UCH(x) ((int) (x)) +#else /* !HAVE_UNSIGNED_CHAR */ +#ifdef CHAR_IS_UNSIGNED +typedef char U_CHAR; +#define UCH(x) ((int) (x)) +#else +typedef char U_CHAR; +#define UCH(x) ((int) (x) & 0xFF) +#endif +#endif /* HAVE_UNSIGNED_CHAR */ + + +#define ReadOK(file,buffer,len) (JFREAD(file,buffer,len) == ((size_t) (len))) + + +/* Private version of data source object */ + +typedef struct _bmp_source_struct * bmp_source_ptr; + +typedef struct _bmp_source_struct { + struct cjpeg_source_struct pub; /* public fields */ + + j_compress_ptr cinfo; /* back link saves passing separate parm */ + + JSAMPARRAY colormap; /* BMP colormap (converted to my format) */ + + jvirt_sarray_ptr whole_image; /* Needed to reverse row order */ + JDIMENSION source_row; /* Current source row number */ + JDIMENSION row_width; /* Physical width of scanlines in file */ + + int bits_per_pixel; /* remembers 8- or 24-bit format */ +} bmp_source_struct; + + +LOCAL(int) +read_byte (bmp_source_ptr sinfo) +/* Read next byte from BMP file */ +{ + register FILE *infile = sinfo->pub.input_file; + register int c; + + if ((c = getc(infile)) == EOF) + ERREXIT(sinfo->cinfo, JERR_INPUT_EOF); + return c; +} + + +LOCAL(void) +read_colormap (bmp_source_ptr sinfo, int cmaplen, int mapentrysize) +/* Read the colormap from a BMP file */ +{ + int i; + + switch (mapentrysize) { + case 3: + /* BGR format (occurs in OS/2 files) */ + for (i = 0; i < cmaplen; i++) { + sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo); + sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo); + sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo); + } + break; + case 4: + /* BGR0 format (occurs in MS Windows files) */ + for (i = 0; i < cmaplen; i++) { + sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo); + sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo); + sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo); + (void) read_byte(sinfo); + } + break; + default: + ERREXIT(sinfo->cinfo, JERR_BMP_BADCMAP); + break; + } +} + + +/* + * Read one row of pixels. + * The image has been read into the whole_image array, but is otherwise + * unprocessed. We must read it out in top-to-bottom row order, and if + * it is an 8-bit image, we must expand colormapped pixels to 24bit format. + */ + +METHODDEF(JDIMENSION) +get_8bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +/* This version is for reading 8-bit colormap indexes */ +{ + bmp_source_ptr source = (bmp_source_ptr) sinfo; + register JSAMPARRAY colormap = source->colormap; + JSAMPARRAY image_ptr; + register int t; + register JSAMPROW inptr, outptr; + register JDIMENSION col; + + /* Fetch next row from virtual array */ + source->source_row--; + image_ptr = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, source->whole_image, + source->source_row, (JDIMENSION) 1, FALSE); + + /* Expand the colormap indexes to real data */ + inptr = image_ptr[0]; + outptr = source->pub.buffer[0]; + for (col = cinfo->image_width; col > 0; col--) { + t = GETJSAMPLE(*inptr++); + *outptr++ = colormap[0][t]; /* can omit GETJSAMPLE() safely */ + *outptr++ = colormap[1][t]; + *outptr++ = colormap[2][t]; + } + + return 1; +} + + +METHODDEF(JDIMENSION) +get_24bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +/* This version is for reading 24-bit pixels */ +{ + bmp_source_ptr source = (bmp_source_ptr) sinfo; + JSAMPARRAY image_ptr; + register JSAMPROW inptr, outptr; + register JDIMENSION col; + + /* Fetch next row from virtual array */ + source->source_row--; + image_ptr = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, source->whole_image, + source->source_row, (JDIMENSION) 1, FALSE); + + /* Transfer data. Note source values are in BGR order + * (even though Microsoft's own documents say the opposite). + */ + inptr = image_ptr[0]; + outptr = source->pub.buffer[0]; + for (col = cinfo->image_width; col > 0; col--) { + outptr[2] = *inptr++; /* can omit GETJSAMPLE() safely */ + outptr[1] = *inptr++; + outptr[0] = *inptr++; + outptr += 3; + } + + return 1; +} + + +METHODDEF(JDIMENSION) +get_32bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +/* This version is for reading 32-bit pixels */ +{ + bmp_source_ptr source = (bmp_source_ptr) sinfo; + JSAMPARRAY image_ptr; + register JSAMPROW inptr, outptr; + register JDIMENSION col; + + /* Fetch next row from virtual array */ + source->source_row--; + image_ptr = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, source->whole_image, + source->source_row, (JDIMENSION) 1, FALSE); + /* Transfer data. Note source values are in BGR order + * (even though Microsoft's own documents say the opposite). + */ + inptr = image_ptr[0]; + outptr = source->pub.buffer[0]; + for (col = cinfo->image_width; col > 0; col--) { + outptr[2] = *inptr++; /* can omit GETJSAMPLE() safely */ + outptr[1] = *inptr++; + outptr[0] = *inptr++; + inptr++; /* skip the 4th byte (Alpha channel) */ + outptr += 3; + } + + return 1; +} + + +/* + * This method loads the image into whole_image during the first call on + * get_pixel_rows. The get_pixel_rows pointer is then adjusted to call + * get_8bit_row, get_24bit_row, or get_32bit_row on subsequent calls. + */ + +METHODDEF(JDIMENSION) +preload_image (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +{ + bmp_source_ptr source = (bmp_source_ptr) sinfo; + register FILE *infile = source->pub.input_file; + register int c; + register JSAMPROW out_ptr; + JSAMPARRAY image_ptr; + JDIMENSION row, col; + cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; + + /* Read the data into a virtual array in input-file row order. */ + for (row = 0; row < cinfo->image_height; row++) { + if (progress != NULL) { + progress->pub.pass_counter = (long) row; + progress->pub.pass_limit = (long) cinfo->image_height; + (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); + } + image_ptr = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, source->whole_image, + row, (JDIMENSION) 1, TRUE); + out_ptr = image_ptr[0]; + for (col = source->row_width; col > 0; col--) { + /* inline copy of read_byte() for speed */ + if ((c = getc(infile)) == EOF) + ERREXIT(cinfo, JERR_INPUT_EOF); + *out_ptr++ = (JSAMPLE) c; + } + } + if (progress != NULL) + progress->completed_extra_passes++; + + /* Set up to read from the virtual array in top-to-bottom order */ + switch (source->bits_per_pixel) { + case 8: + source->pub.get_pixel_rows = get_8bit_row; + break; + case 24: + source->pub.get_pixel_rows = get_24bit_row; + break; + case 32: + source->pub.get_pixel_rows = get_32bit_row; + break; + default: + ERREXIT(cinfo, JERR_BMP_BADDEPTH); + } + source->source_row = cinfo->image_height; + + /* And read the first row */ + return (*source->pub.get_pixel_rows) (cinfo, sinfo); +} + + +/* + * Read the file header; return image size and component count. + */ + +METHODDEF(void) +start_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +{ + bmp_source_ptr source = (bmp_source_ptr) sinfo; + U_CHAR bmpfileheader[14]; + U_CHAR bmpinfoheader[64]; +#define GET_2B(array,offset) ((unsigned int) UCH(array[offset]) + \ + (((unsigned int) UCH(array[offset+1])) << 8)) +#define GET_4B(array,offset) ((INT32) UCH(array[offset]) + \ + (((INT32) UCH(array[offset+1])) << 8) + \ + (((INT32) UCH(array[offset+2])) << 16) + \ + (((INT32) UCH(array[offset+3])) << 24)) + INT32 bfOffBits; + INT32 headerSize; + INT32 biWidth; + INT32 biHeight; + unsigned int biPlanes; + INT32 biCompression; + INT32 biXPelsPerMeter,biYPelsPerMeter; + INT32 biClrUsed = 0; + int mapentrysize = 0; /* 0 indicates no colormap */ + INT32 bPad; + JDIMENSION row_width; + + /* Read and verify the bitmap file header */ + if (! ReadOK(source->pub.input_file, bmpfileheader, 14)) + ERREXIT(cinfo, JERR_INPUT_EOF); + if (GET_2B(bmpfileheader,0) != 0x4D42) /* 'BM' */ + ERREXIT(cinfo, JERR_BMP_NOT); + bfOffBits = (INT32) GET_4B(bmpfileheader,10); + /* We ignore the remaining fileheader fields */ + + /* The infoheader might be 12 bytes (OS/2 1.x), 40 bytes (Windows), + * or 64 bytes (OS/2 2.x). Check the first 4 bytes to find out which. + */ + if (! ReadOK(source->pub.input_file, bmpinfoheader, 4)) + ERREXIT(cinfo, JERR_INPUT_EOF); + headerSize = (INT32) GET_4B(bmpinfoheader,0); + if (headerSize < 12 || headerSize > 64) + ERREXIT(cinfo, JERR_BMP_BADHEADER); + if (! ReadOK(source->pub.input_file, bmpinfoheader+4, headerSize-4)) + ERREXIT(cinfo, JERR_INPUT_EOF); + + switch ((int) headerSize) { + case 12: + /* Decode OS/2 1.x header (Microsoft calls this a BITMAPCOREHEADER) */ + biWidth = (INT32) GET_2B(bmpinfoheader,4); + biHeight = (INT32) GET_2B(bmpinfoheader,6); + biPlanes = GET_2B(bmpinfoheader,8); + source->bits_per_pixel = (int) GET_2B(bmpinfoheader,10); + + switch (source->bits_per_pixel) { + case 8: /* colormapped image */ + mapentrysize = 3; /* OS/2 uses RGBTRIPLE colormap */ + TRACEMS2(cinfo, 1, JTRC_BMP_OS2_MAPPED, (int) biWidth, (int) biHeight); + break; + case 24: /* RGB image */ + TRACEMS2(cinfo, 1, JTRC_BMP_OS2, (int) biWidth, (int) biHeight); + break; + default: + ERREXIT(cinfo, JERR_BMP_BADDEPTH); + break; + } + break; + case 40: + case 64: + /* Decode Windows 3.x header (Microsoft calls this a BITMAPINFOHEADER) */ + /* or OS/2 2.x header, which has additional fields that we ignore */ + biWidth = GET_4B(bmpinfoheader,4); + biHeight = GET_4B(bmpinfoheader,8); + biPlanes = GET_2B(bmpinfoheader,12); + source->bits_per_pixel = (int) GET_2B(bmpinfoheader,14); + biCompression = GET_4B(bmpinfoheader,16); + biXPelsPerMeter = GET_4B(bmpinfoheader,24); + biYPelsPerMeter = GET_4B(bmpinfoheader,28); + biClrUsed = GET_4B(bmpinfoheader,32); + /* biSizeImage, biClrImportant fields are ignored */ + + switch (source->bits_per_pixel) { + case 8: /* colormapped image */ + mapentrysize = 4; /* Windows uses RGBQUAD colormap */ + TRACEMS2(cinfo, 1, JTRC_BMP_MAPPED, (int) biWidth, (int) biHeight); + break; + case 24: /* RGB image */ + TRACEMS2(cinfo, 1, JTRC_BMP, (int) biWidth, (int) biHeight); + break; + case 32: /* RGB image + Alpha channel */ + TRACEMS2(cinfo, 1, JTRC_BMP, (int) biWidth, (int) biHeight); + break; + default: + ERREXIT(cinfo, JERR_BMP_BADDEPTH); + break; + } + if (biCompression != 0) + ERREXIT(cinfo, JERR_BMP_COMPRESSED); + + if (biXPelsPerMeter > 0 && biYPelsPerMeter > 0) { + /* Set JFIF density parameters from the BMP data */ + cinfo->X_density = (UINT16) (biXPelsPerMeter/100); /* 100 cm per meter */ + cinfo->Y_density = (UINT16) (biYPelsPerMeter/100); + cinfo->density_unit = 2; /* dots/cm */ + } + break; + default: + ERREXIT(cinfo, JERR_BMP_BADHEADER); + return; + } + + if (biWidth <= 0 || biHeight <= 0) + ERREXIT(cinfo, JERR_BMP_EMPTY); + if (biPlanes != 1) + ERREXIT(cinfo, JERR_BMP_BADPLANES); + + /* Compute distance to bitmap data --- will adjust for colormap below */ + bPad = bfOffBits - (headerSize + 14); + + /* Read the colormap, if any */ + if (mapentrysize > 0) { + if (biClrUsed <= 0) + biClrUsed = 256; /* assume it's 256 */ + else if (biClrUsed > 256) + ERREXIT(cinfo, JERR_BMP_BADCMAP); + /* Allocate space to store the colormap */ + source->colormap = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) biClrUsed, (JDIMENSION) 3); + /* and read it from the file */ + read_colormap(source, (int) biClrUsed, mapentrysize); + /* account for size of colormap */ + bPad -= biClrUsed * mapentrysize; + } + + /* Skip any remaining pad bytes */ + if (bPad < 0) /* incorrect bfOffBits value? */ + ERREXIT(cinfo, JERR_BMP_BADHEADER); + while (--bPad >= 0) { + (void) read_byte(source); + } + + /* Compute row width in file, including padding to 4-byte boundary */ + if (source->bits_per_pixel == 24) + row_width = (JDIMENSION) (biWidth * 3); + else if (source->bits_per_pixel == 32) + row_width = (JDIMENSION) (biWidth * 4); + else + row_width = (JDIMENSION) biWidth; + while ((row_width & 3) != 0) row_width++; + source->row_width = row_width; + + /* Allocate space for inversion array, prepare for preload pass */ + source->whole_image = (*cinfo->mem->request_virt_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, + row_width, (JDIMENSION) biHeight, (JDIMENSION) 1); + source->pub.get_pixel_rows = preload_image; + if (cinfo->progress != NULL) { + cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; + progress->total_extra_passes++; /* count file input as separate pass */ + } + + /* Allocate one-row buffer for returned data */ + source->pub.buffer = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) (biWidth * 3), (JDIMENSION) 1); + source->pub.buffer_height = 1; + + cinfo->in_color_space = JCS_RGB; + cinfo->input_components = 3; + cinfo->data_precision = 8; + cinfo->image_width = (JDIMENSION) biWidth; + cinfo->image_height = (JDIMENSION) biHeight; +} + + +/* + * Finish up at the end of the file. + */ + +METHODDEF(void) +finish_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +{ + /* no work */ +} + + +/* + * The module selection routine for BMP format input. + */ + +GLOBAL(cjpeg_source_ptr) +jinit_read_bmp (j_compress_ptr cinfo) +{ + bmp_source_ptr source; + + /* Create module interface object */ + source = (bmp_source_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(bmp_source_struct)); + source->cinfo = cinfo; /* make back link for subroutines */ + /* Fill in method ptrs, except get_pixel_rows which start_input sets */ + source->pub.start_input = start_input_bmp; + source->pub.finish_input = finish_input_bmp; + + return (cjpeg_source_ptr) source; +} + +#endif /* BMP_SUPPORTED */ diff --git a/jpeg-8c/rdcolmap.c b/jpeg-8c/rdcolmap.c new file mode 100644 index 00000000..42b34376 --- /dev/null +++ b/jpeg-8c/rdcolmap.c @@ -0,0 +1,253 @@ +/* + * rdcolmap.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 implements djpeg's "-map file" switch. It reads a source image + * and constructs a colormap to be supplied to the JPEG decompressor. + * + * Currently, these file formats are supported for the map file: + * GIF: the contents of the GIF's global colormap are used. + * PPM (either text or raw flavor): the entire file is read and + * each unique pixel value is entered in the map. + * Note that reading a large PPM file will be horrendously slow. + * Typically, a PPM-format map file should contain just one pixel + * of each desired color. Such a file can be extracted from an + * ordinary image PPM file with ppmtomap(1). + * + * Rescaling a PPM that has a maxval unequal to MAXJSAMPLE is not + * currently implemented. + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ + +#ifdef QUANT_2PASS_SUPPORTED /* otherwise can't quantize to supplied map */ + +/* Portions of this code are based on the PBMPLUS library, which is: +** +** Copyright (C) 1988 by Jef Poskanzer. +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, provided +** that the above copyright notice appear in all copies and that both that +** copyright notice and this permission notice appear in supporting +** documentation. This software is provided "as is" without express or +** implied warranty. +*/ + + +/* + * Add a (potentially) new color to the color map. + */ + +LOCAL(void) +add_map_entry (j_decompress_ptr cinfo, int R, int G, int B) +{ + JSAMPROW colormap0 = cinfo->colormap[0]; + JSAMPROW colormap1 = cinfo->colormap[1]; + JSAMPROW colormap2 = cinfo->colormap[2]; + int ncolors = cinfo->actual_number_of_colors; + int index; + + /* Check for duplicate color. */ + for (index = 0; index < ncolors; index++) { + if (GETJSAMPLE(colormap0[index]) == R && + GETJSAMPLE(colormap1[index]) == G && + GETJSAMPLE(colormap2[index]) == B) + return; /* color is already in map */ + } + + /* Check for map overflow. */ + if (ncolors >= (MAXJSAMPLE+1)) + ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, (MAXJSAMPLE+1)); + + /* OK, add color to map. */ + colormap0[ncolors] = (JSAMPLE) R; + colormap1[ncolors] = (JSAMPLE) G; + colormap2[ncolors] = (JSAMPLE) B; + cinfo->actual_number_of_colors++; +} + + +/* + * Extract color map from a GIF file. + */ + +LOCAL(void) +read_gif_map (j_decompress_ptr cinfo, FILE * infile) +{ + int header[13]; + int i, colormaplen; + int R, G, B; + + /* Initial 'G' has already been read by read_color_map */ + /* Read the rest of the GIF header and logical screen descriptor */ + for (i = 1; i < 13; i++) { + if ((header[i] = getc(infile)) == EOF) + ERREXIT(cinfo, JERR_BAD_CMAP_FILE); + } + + /* Verify GIF Header */ + if (header[1] != 'I' || header[2] != 'F') + ERREXIT(cinfo, JERR_BAD_CMAP_FILE); + + /* There must be a global color map. */ + if ((header[10] & 0x80) == 0) + ERREXIT(cinfo, JERR_BAD_CMAP_FILE); + + /* OK, fetch it. */ + colormaplen = 2 << (header[10] & 0x07); + + for (i = 0; i < colormaplen; i++) { + R = getc(infile); + G = getc(infile); + B = getc(infile); + if (R == EOF || G == EOF || B == EOF) + ERREXIT(cinfo, JERR_BAD_CMAP_FILE); + add_map_entry(cinfo, + R << (BITS_IN_JSAMPLE-8), + G << (BITS_IN_JSAMPLE-8), + B << (BITS_IN_JSAMPLE-8)); + } +} + + +/* Support routines for reading PPM */ + + +LOCAL(int) +pbm_getc (FILE * infile) +/* Read next char, skipping over any comments */ +/* A comment/newline sequence is returned as a newline */ +{ + register int ch; + + ch = getc(infile); + if (ch == '#') { + do { + ch = getc(infile); + } while (ch != '\n' && ch != EOF); + } + return ch; +} + + +LOCAL(unsigned int) +read_pbm_integer (j_decompress_ptr cinfo, FILE * infile) +/* Read an unsigned decimal integer from the PPM file */ +/* Swallows one trailing character after the integer */ +/* Note that on a 16-bit-int machine, only values up to 64k can be read. */ +/* This should not be a problem in practice. */ +{ + register int ch; + register unsigned int val; + + /* Skip any leading whitespace */ + do { + ch = pbm_getc(infile); + if (ch == EOF) + ERREXIT(cinfo, JERR_BAD_CMAP_FILE); + } while (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r'); + + if (ch < '0' || ch > '9') + ERREXIT(cinfo, JERR_BAD_CMAP_FILE); + + val = ch - '0'; + while ((ch = pbm_getc(infile)) >= '0' && ch <= '9') { + val *= 10; + val += ch - '0'; + } + return val; +} + + +/* + * Extract color map from a PPM file. + */ + +LOCAL(void) +read_ppm_map (j_decompress_ptr cinfo, FILE * infile) +{ + int c; + unsigned int w, h, maxval, row, col; + int R, G, B; + + /* Initial 'P' has already been read by read_color_map */ + c = getc(infile); /* save format discriminator for a sec */ + + /* while we fetch the remaining header info */ + w = read_pbm_integer(cinfo, infile); + h = read_pbm_integer(cinfo, infile); + maxval = read_pbm_integer(cinfo, infile); + + if (w <= 0 || h <= 0 || maxval <= 0) /* error check */ + ERREXIT(cinfo, JERR_BAD_CMAP_FILE); + + /* For now, we don't support rescaling from an unusual maxval. */ + if (maxval != (unsigned int) MAXJSAMPLE) + ERREXIT(cinfo, JERR_BAD_CMAP_FILE); + + switch (c) { + case '3': /* it's a text-format PPM file */ + for (row = 0; row < h; row++) { + for (col = 0; col < w; col++) { + R = read_pbm_integer(cinfo, infile); + G = read_pbm_integer(cinfo, infile); + B = read_pbm_integer(cinfo, infile); + add_map_entry(cinfo, R, G, B); + } + } + break; + + case '6': /* it's a raw-format PPM file */ + for (row = 0; row < h; row++) { + for (col = 0; col < w; col++) { + R = getc(infile); + G = getc(infile); + B = getc(infile); + if (R == EOF || G == EOF || B == EOF) + ERREXIT(cinfo, JERR_BAD_CMAP_FILE); + add_map_entry(cinfo, R, G, B); + } + } + break; + + default: + ERREXIT(cinfo, JERR_BAD_CMAP_FILE); + break; + } +} + + +/* + * Main entry point from djpeg.c. + * Input: opened input file (from file name argument on command line). + * Output: colormap and actual_number_of_colors fields are set in cinfo. + */ + +GLOBAL(void) +read_color_map (j_decompress_ptr cinfo, FILE * infile) +{ + /* Allocate space for a color map of maximum supported size. */ + cinfo->colormap = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) (MAXJSAMPLE+1), (JDIMENSION) 3); + cinfo->actual_number_of_colors = 0; /* initialize map to empty */ + + /* Read first byte to determine file format */ + switch (getc(infile)) { + case 'G': + read_gif_map(cinfo, infile); + break; + case 'P': + read_ppm_map(cinfo, infile); + break; + default: + ERREXIT(cinfo, JERR_BAD_CMAP_FILE); + break; + } +} + +#endif /* QUANT_2PASS_SUPPORTED */ diff --git a/jpeg-8c/rdgif.c b/jpeg-8c/rdgif.c new file mode 100644 index 00000000..b27c1675 --- /dev/null +++ b/jpeg-8c/rdgif.c @@ -0,0 +1,38 @@ +/* + * rdgif.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 routines to read input images in GIF format. + * + ***************************************************************************** + * NOTE: to avoid entanglements with Unisys' patent on LZW compression, * + * the ability to read GIF files has been removed from the IJG distribution. * + * Sorry about that. * + ***************************************************************************** + * + * We are required to state that + * "The Graphics Interchange Format(c) is the Copyright property of + * CompuServe Incorporated. GIF(sm) is a Service Mark property of + * CompuServe Incorporated." + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ + +#ifdef GIF_SUPPORTED + +/* + * The module selection routine for GIF format input. + */ + +GLOBAL(cjpeg_source_ptr) +jinit_read_gif (j_compress_ptr cinfo) +{ + fprintf(stderr, "GIF input is unsupported for legal reasons. Sorry.\n"); + exit(EXIT_FAILURE); + return NULL; /* keep compiler happy */ +} + +#endif /* GIF_SUPPORTED */ diff --git a/jpeg-8c/rdjpgcom b/jpeg-8c/rdjpgcom new file mode 100755 index 0000000000000000000000000000000000000000..483214b6b9df2aafb42922ad16c937836107b4f0 GIT binary patch literal 24887 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 RzVGcUKveLlZyTWz@;})gH%0&e literal 0 HcmV?d00001 diff --git a/jpeg-8c/rdjpgcom.1 b/jpeg-8c/rdjpgcom.1 new file mode 100644 index 00000000..97611df8 --- /dev/null +++ b/jpeg-8c/rdjpgcom.1 @@ -0,0 +1,63 @@ +.TH RDJPGCOM 1 "02 April 2009" +.SH NAME +rdjpgcom \- display text comments from a JPEG file +.SH SYNOPSIS +.B rdjpgcom +[ +.B \-raw +] +[ +.B \-verbose +] +[ +.I filename +] +.LP +.SH DESCRIPTION +.LP +.B rdjpgcom +reads the named JPEG/JFIF file, or the standard input if no file is named, +and prints any text comments found in the file on the standard output. +.PP +The JPEG standard allows "comment" (COM) blocks to occur within a JPEG file. +Although the standard doesn't actually define what COM blocks are for, they +are widely used to hold user-supplied text strings. This lets you add +annotations, titles, index terms, etc to your JPEG files, and later retrieve +them as text. COM blocks do not interfere with the image stored in the JPEG +file. The maximum size of a COM block is 64K, but you can have as many of +them as you like in one JPEG file. +.SH OPTIONS +.TP +.B \-raw +Normally +.B rdjpgcom +escapes non-printable characters in comments, for security reasons. +This option avoids that. +.PP +.B \-verbose +Causes +.B rdjpgcom +to also display the JPEG image dimensions. +.PP +Switch names may be abbreviated, and are not case sensitive. +.SH HINTS +.B rdjpgcom +does not depend on the IJG JPEG library. Its source code is intended as an +illustration of the minimum amount of code required to parse a JPEG file +header correctly. +.PP +In +.B \-verbose +mode, +.B rdjpgcom +will also attempt to print the contents of any "APP12" markers as text. +Some digital cameras produce APP12 markers containing useful textual +information. If you like, you can modify the source code to print +other APPn marker types as well. +.SH SEE ALSO +.BR cjpeg (1), +.BR djpeg (1), +.BR jpegtran (1), +.BR wrjpgcom (1) +.SH AUTHOR +Independent JPEG Group diff --git a/jpeg-8c/rdjpgcom.c b/jpeg-8c/rdjpgcom.c new file mode 100644 index 00000000..37191547 --- /dev/null +++ b/jpeg-8c/rdjpgcom.c @@ -0,0 +1,515 @@ +/* + * rdjpgcom.c + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * Modified 2009 by Bill Allombert, Guido Vollbeding. + * 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 very simple stand-alone application that displays + * the text in COM (comment) markers in a JFIF file. + * This may be useful as an example of the minimum logic needed to parse + * JPEG markers. + */ + +#define JPEG_CJPEG_DJPEG /* to get the command-line config symbols */ +#include "jinclude.h" /* get auto-config symbols, */ + +#ifdef HAVE_LOCALE_H +#include /* Bill Allombert: use locale for isprint */ +#endif +#include /* to declare isupper(), tolower() */ +#ifdef USE_SETMODE +#include /* to declare setmode()'s parameter macros */ +/* If you have setmode() but not , just delete this line: */ +#include /* to declare setmode() */ +#endif + +#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ +#ifdef __MWERKS__ +#include /* Metrowerks needs this */ +#include /* ... and this */ +#endif +#ifdef THINK_C +#include /* Think declares it here */ +#endif +#endif + +#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */ +#define READ_BINARY "r" +#else +#ifdef VMS /* VMS is very nonstandard */ +#define READ_BINARY "rb", "ctx=stm" +#else /* standard ANSI-compliant case */ +#define READ_BINARY "rb" +#endif +#endif + +#ifndef EXIT_FAILURE /* define exit() codes if not provided */ +#define EXIT_FAILURE 1 +#endif +#ifndef EXIT_SUCCESS +#ifdef VMS +#define EXIT_SUCCESS 1 /* VMS is very nonstandard */ +#else +#define EXIT_SUCCESS 0 +#endif +#endif + + +/* + * These macros are used to read the input file. + * To reuse this code in another application, you might need to change these. + */ + +static FILE * infile; /* input JPEG file */ + +/* Return next input byte, or EOF if no more */ +#define NEXTBYTE() getc(infile) + + +/* Error exit handler */ +#define ERREXIT(msg) (fprintf(stderr, "%s\n", msg), exit(EXIT_FAILURE)) + + +/* Read one byte, testing for EOF */ +static int +read_1_byte (void) +{ + int c; + + c = NEXTBYTE(); + if (c == EOF) + ERREXIT("Premature EOF in JPEG file"); + return c; +} + +/* Read 2 bytes, convert to unsigned int */ +/* All 2-byte quantities in JPEG markers are MSB first */ +static unsigned int +read_2_bytes (void) +{ + int c1, c2; + + c1 = NEXTBYTE(); + if (c1 == EOF) + ERREXIT("Premature EOF in JPEG file"); + c2 = NEXTBYTE(); + if (c2 == EOF) + ERREXIT("Premature EOF in JPEG file"); + return (((unsigned int) c1) << 8) + ((unsigned int) c2); +} + + +/* + * JPEG markers consist of one or more 0xFF bytes, followed by a marker + * code byte (which is not an FF). Here are the marker codes of interest + * in this program. (See jdmarker.c for a more complete list.) + */ + +#define M_SOF0 0xC0 /* Start Of Frame N */ +#define M_SOF1 0xC1 /* N indicates which compression process */ +#define M_SOF2 0xC2 /* Only SOF0-SOF2 are now in common use */ +#define M_SOF3 0xC3 +#define M_SOF5 0xC5 /* NB: codes C4 and CC are NOT SOF markers */ +#define M_SOF6 0xC6 +#define M_SOF7 0xC7 +#define M_SOF9 0xC9 +#define M_SOF10 0xCA +#define M_SOF11 0xCB +#define M_SOF13 0xCD +#define M_SOF14 0xCE +#define M_SOF15 0xCF +#define M_SOI 0xD8 /* Start Of Image (beginning of datastream) */ +#define M_EOI 0xD9 /* End Of Image (end of datastream) */ +#define M_SOS 0xDA /* Start Of Scan (begins compressed data) */ +#define M_APP0 0xE0 /* Application-specific marker, type N */ +#define M_APP12 0xEC /* (we don't bother to list all 16 APPn's) */ +#define M_COM 0xFE /* COMment */ + + +/* + * Find the next JPEG marker and return its marker code. + * We expect at least one FF byte, possibly more if the compressor used FFs + * to pad the file. + * There could also be non-FF garbage between markers. The treatment of such + * garbage is unspecified; we choose to skip over it but emit a warning msg. + * NB: this routine must not be used after seeing SOS marker, since it will + * not deal correctly with FF/00 sequences in the compressed image data... + */ + +static int +next_marker (void) +{ + int c; + int discarded_bytes = 0; + + /* Find 0xFF byte; count and skip any non-FFs. */ + c = read_1_byte(); + while (c != 0xFF) { + discarded_bytes++; + c = read_1_byte(); + } + /* Get marker code byte, swallowing any duplicate FF bytes. Extra FFs + * are legal as pad bytes, so don't count them in discarded_bytes. + */ + do { + c = read_1_byte(); + } while (c == 0xFF); + + if (discarded_bytes != 0) { + fprintf(stderr, "Warning: garbage data found in JPEG file\n"); + } + + return c; +} + + +/* + * Read the initial marker, which should be SOI. + * For a JFIF file, the first two bytes of the file should be literally + * 0xFF M_SOI. To be more general, we could use next_marker, but if the + * input file weren't actually JPEG at all, next_marker might read the whole + * file and then return a misleading error message... + */ + +static int +first_marker (void) +{ + int c1, c2; + + c1 = NEXTBYTE(); + c2 = NEXTBYTE(); + if (c1 != 0xFF || c2 != M_SOI) + ERREXIT("Not a JPEG file"); + return c2; +} + + +/* + * Most types of marker are followed by a variable-length parameter segment. + * This routine skips over the parameters for any marker we don't otherwise + * want to process. + * Note that we MUST skip the parameter segment explicitly in order not to + * be fooled by 0xFF bytes that might appear within the parameter segment; + * such bytes do NOT introduce new markers. + */ + +static void +skip_variable (void) +/* Skip over an unknown or uninteresting variable-length marker */ +{ + unsigned int length; + + /* Get the marker parameter length count */ + length = read_2_bytes(); + /* Length includes itself, so must be at least 2 */ + if (length < 2) + ERREXIT("Erroneous JPEG marker length"); + length -= 2; + /* Skip over the remaining bytes */ + while (length > 0) { + (void) read_1_byte(); + length--; + } +} + + +/* + * Process a COM marker. + * We want to print out the marker contents as legible text; + * we must guard against non-text junk and varying newline representations. + */ + +static void +process_COM (int raw) +{ + unsigned int length; + int ch; + int lastch = 0; + + /* Bill Allombert: set locale properly for isprint */ +#ifdef HAVE_LOCALE_H + setlocale(LC_CTYPE, ""); +#endif + + /* Get the marker parameter length count */ + length = read_2_bytes(); + /* Length includes itself, so must be at least 2 */ + if (length < 2) + ERREXIT("Erroneous JPEG marker length"); + length -= 2; + + while (length > 0) { + ch = read_1_byte(); + if (raw) { + putc(ch, stdout); + /* Emit the character in a readable form. + * Nonprintables are converted to \nnn form, + * while \ is converted to \\. + * Newlines in CR, CR/LF, or LF form will be printed as one newline. + */ + } else if (ch == '\r') { + printf("\n"); + } else if (ch == '\n') { + if (lastch != '\r') + printf("\n"); + } else if (ch == '\\') { + printf("\\\\"); + } else if (isprint(ch)) { + putc(ch, stdout); + } else { + printf("\\%03o", ch); + } + lastch = ch; + length--; + } + printf("\n"); + + /* Bill Allombert: revert to C locale */ +#ifdef HAVE_LOCALE_H + setlocale(LC_CTYPE, "C"); +#endif +} + + +/* + * Process a SOFn marker. + * This code is only needed if you want to know the image dimensions... + */ + +static void +process_SOFn (int marker) +{ + unsigned int length; + unsigned int image_height, image_width; + int data_precision, num_components; + const char * process; + int ci; + + length = read_2_bytes(); /* usual parameter length count */ + + data_precision = read_1_byte(); + image_height = read_2_bytes(); + image_width = read_2_bytes(); + num_components = read_1_byte(); + + switch (marker) { + case M_SOF0: process = "Baseline"; break; + case M_SOF1: process = "Extended sequential"; break; + case M_SOF2: process = "Progressive"; break; + case M_SOF3: process = "Lossless"; break; + case M_SOF5: process = "Differential sequential"; break; + case M_SOF6: process = "Differential progressive"; break; + case M_SOF7: process = "Differential lossless"; break; + case M_SOF9: process = "Extended sequential, arithmetic coding"; break; + case M_SOF10: process = "Progressive, arithmetic coding"; break; + case M_SOF11: process = "Lossless, arithmetic coding"; break; + case M_SOF13: process = "Differential sequential, arithmetic coding"; break; + case M_SOF14: process = "Differential progressive, arithmetic coding"; break; + case M_SOF15: process = "Differential lossless, arithmetic coding"; break; + default: process = "Unknown"; break; + } + + printf("JPEG image is %uw * %uh, %d color components, %d bits per sample\n", + image_width, image_height, num_components, data_precision); + printf("JPEG process: %s\n", process); + + if (length != (unsigned int) (8 + num_components * 3)) + ERREXIT("Bogus SOF marker length"); + + for (ci = 0; ci < num_components; ci++) { + (void) read_1_byte(); /* Component ID code */ + (void) read_1_byte(); /* H, V sampling factors */ + (void) read_1_byte(); /* Quantization table number */ + } +} + + +/* + * Parse the marker stream until SOS or EOI is seen; + * display any COM markers. + * While the companion program wrjpgcom will always insert COM markers before + * SOFn, other implementations might not, so we scan to SOS before stopping. + * If we were only interested in the image dimensions, we would stop at SOFn. + * (Conversely, if we only cared about COM markers, there would be no need + * for special code to handle SOFn; we could treat it like other markers.) + */ + +static int +scan_JPEG_header (int verbose, int raw) +{ + int marker; + + /* Expect SOI at start of file */ + if (first_marker() != M_SOI) + ERREXIT("Expected SOI marker first"); + + /* Scan miscellaneous markers until we reach SOS. */ + for (;;) { + marker = next_marker(); + switch (marker) { + /* Note that marker codes 0xC4, 0xC8, 0xCC are not, and must not be, + * treated as SOFn. C4 in particular is actually DHT. + */ + case M_SOF0: /* Baseline */ + case M_SOF1: /* Extended sequential, Huffman */ + case M_SOF2: /* Progressive, Huffman */ + 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_SOF9: /* Extended sequential, arithmetic */ + case M_SOF10: /* Progressive, arithmetic */ + case M_SOF11: /* Lossless, arithmetic */ + case M_SOF13: /* Differential sequential, arithmetic */ + case M_SOF14: /* Differential progressive, arithmetic */ + case M_SOF15: /* Differential lossless, arithmetic */ + if (verbose) + process_SOFn(marker); + else + skip_variable(); + break; + + case M_SOS: /* stop before hitting compressed data */ + return marker; + + case M_EOI: /* in case it's a tables-only JPEG stream */ + return marker; + + case M_COM: + process_COM(raw); + break; + + case M_APP12: + /* Some digital camera makers put useful textual information into + * APP12 markers, so we print those out too when in -verbose mode. + */ + if (verbose) { + printf("APP12 contains:\n"); + process_COM(raw); + } else + skip_variable(); + break; + + default: /* Anything else just gets skipped */ + skip_variable(); /* we assume it has a parameter count... */ + break; + } + } /* end loop */ +} + + +/* Command line parsing code */ + +static const char * progname; /* program name for error messages */ + + +static void +usage (void) +/* complain about bad command line */ +{ + fprintf(stderr, "rdjpgcom displays any textual comments in a JPEG file.\n"); + + fprintf(stderr, "Usage: %s [switches] [inputfile]\n", progname); + + fprintf(stderr, "Switches (names may be abbreviated):\n"); + fprintf(stderr, " -raw Display non-printable characters in comments (unsafe)\n"); + fprintf(stderr, " -verbose Also display dimensions of JPEG image\n"); + + exit(EXIT_FAILURE); +} + + +static int +keymatch (char * arg, const char * keyword, int minchars) +/* Case-insensitive matching of (possibly abbreviated) keyword switches. */ +/* keyword is the constant keyword (must be lower case already), */ +/* minchars is length of minimum legal abbreviation. */ +{ + register int ca, ck; + register int nmatched = 0; + + while ((ca = *arg++) != '\0') { + if ((ck = *keyword++) == '\0') + return 0; /* arg longer than keyword, no good */ + if (isupper(ca)) /* force arg to lcase (assume ck is already) */ + ca = tolower(ca); + if (ca != ck) + return 0; /* no good */ + nmatched++; /* count matched characters */ + } + /* reached end of argument; fail if it's too short for unique abbrev */ + if (nmatched < minchars) + return 0; + return 1; /* A-OK */ +} + + +/* + * The main program. + */ + +int +main (int argc, char **argv) +{ + int argn; + char * arg; + int verbose = 0, raw = 0; + + /* On Mac, fetch a command line. */ +#ifdef USE_CCOMMAND + argc = ccommand(&argv); +#endif + + progname = argv[0]; + if (progname == NULL || progname[0] == 0) + progname = "rdjpgcom"; /* in case C library doesn't provide it */ + + /* Parse switches, if any */ + for (argn = 1; argn < argc; argn++) { + arg = argv[argn]; + if (arg[0] != '-') + break; /* not switch, must be file name */ + arg++; /* advance over '-' */ + if (keymatch(arg, "verbose", 1)) { + verbose++; + } else if (keymatch(arg, "raw", 1)) { + raw = 1; + } else + usage(); + } + + /* Open the input file. */ + /* Unix style: expect zero or one file name */ + if (argn < argc-1) { + fprintf(stderr, "%s: only one input file\n", progname); + usage(); + } + if (argn < argc) { + if ((infile = fopen(argv[argn], READ_BINARY)) == NULL) { + fprintf(stderr, "%s: can't open %s\n", progname, argv[argn]); + exit(EXIT_FAILURE); + } + } else { + /* default input file is stdin */ +#ifdef USE_SETMODE /* need to hack file mode? */ + setmode(fileno(stdin), O_BINARY); +#endif +#ifdef USE_FDOPEN /* need to re-open in binary mode? */ + if ((infile = fdopen(fileno(stdin), READ_BINARY)) == NULL) { + fprintf(stderr, "%s: can't open stdin\n", progname); + exit(EXIT_FAILURE); + } +#else + infile = stdin; +#endif + } + + /* Scan the JPEG headers. */ + (void) scan_JPEG_header(verbose, raw); + + /* All done. */ + exit(EXIT_SUCCESS); + return 0; /* suppress no-return-value warnings */ +} diff --git a/jpeg-8c/rdppm.c b/jpeg-8c/rdppm.c new file mode 100644 index 00000000..a7570227 --- /dev/null +++ b/jpeg-8c/rdppm.c @@ -0,0 +1,459 @@ +/* + * rdppm.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2009 by Bill Allombert, Guido Vollbeding. + * 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 read input images in PPM/PGM format. + * The extended 2-byte-per-sample raw PPM/PGM formats are supported. + * The PBMPLUS library is NOT required to compile this software + * (but it is highly useful as a set of PPM image manipulation programs). + * + * These routines may need modification for non-Unix environments or + * specialized applications. As they stand, they assume input from + * an ordinary stdio stream. They further assume that reading begins + * at the start of the file; start_input may need work if the + * user interface has already read some data (e.g., to determine that + * the file is indeed PPM format). + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ + +#ifdef PPM_SUPPORTED + + +/* Portions of this code are based on the PBMPLUS library, which is: +** +** Copyright (C) 1988 by Jef Poskanzer. +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, provided +** that the above copyright notice appear in all copies and that both that +** copyright notice and this permission notice appear in supporting +** documentation. This software is provided "as is" without express or +** implied warranty. +*/ + + +/* Macros to deal with unsigned chars as efficiently as compiler allows */ + +#ifdef HAVE_UNSIGNED_CHAR +typedef unsigned char U_CHAR; +#define UCH(x) ((int) (x)) +#else /* !HAVE_UNSIGNED_CHAR */ +#ifdef CHAR_IS_UNSIGNED +typedef char U_CHAR; +#define UCH(x) ((int) (x)) +#else +typedef char U_CHAR; +#define UCH(x) ((int) (x) & 0xFF) +#endif +#endif /* HAVE_UNSIGNED_CHAR */ + + +#define ReadOK(file,buffer,len) (JFREAD(file,buffer,len) == ((size_t) (len))) + + +/* + * On most systems, reading individual bytes with getc() is drastically less + * efficient than buffering a row at a time with fread(). On PCs, we must + * allocate the buffer in near data space, because we are assuming small-data + * memory model, wherein fread() can't reach far memory. If you need to + * process very wide images on a PC, you might have to compile in large-memory + * model, or else replace fread() with a getc() loop --- which will be much + * slower. + */ + + +/* Private version of data source object */ + +typedef struct { + struct cjpeg_source_struct pub; /* public fields */ + + U_CHAR *iobuffer; /* non-FAR pointer to I/O buffer */ + JSAMPROW pixrow; /* FAR pointer to same */ + size_t buffer_width; /* width of I/O buffer */ + JSAMPLE *rescale; /* => maxval-remapping array, or NULL */ +} ppm_source_struct; + +typedef ppm_source_struct * ppm_source_ptr; + + +LOCAL(int) +pbm_getc (FILE * infile) +/* Read next char, skipping over any comments */ +/* A comment/newline sequence is returned as a newline */ +{ + register int ch; + + ch = getc(infile); + if (ch == '#') { + do { + ch = getc(infile); + } while (ch != '\n' && ch != EOF); + } + return ch; +} + + +LOCAL(unsigned int) +read_pbm_integer (j_compress_ptr cinfo, FILE * infile) +/* Read an unsigned decimal integer from the PPM file */ +/* Swallows one trailing character after the integer */ +/* Note that on a 16-bit-int machine, only values up to 64k can be read. */ +/* This should not be a problem in practice. */ +{ + register int ch; + register unsigned int val; + + /* Skip any leading whitespace */ + do { + ch = pbm_getc(infile); + if (ch == EOF) + ERREXIT(cinfo, JERR_INPUT_EOF); + } while (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r'); + + if (ch < '0' || ch > '9') + ERREXIT(cinfo, JERR_PPM_NONNUMERIC); + + val = ch - '0'; + while ((ch = pbm_getc(infile)) >= '0' && ch <= '9') { + val *= 10; + val += ch - '0'; + } + return val; +} + + +/* + * Read one row of pixels. + * + * We provide several different versions depending on input file format. + * In all cases, input is scaled to the size of JSAMPLE. + * + * A really fast path is provided for reading byte/sample raw files with + * maxval = MAXJSAMPLE, which is the normal case for 8-bit data. + */ + + +METHODDEF(JDIMENSION) +get_text_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +/* This version is for reading text-format PGM files with any maxval */ +{ + ppm_source_ptr source = (ppm_source_ptr) sinfo; + FILE * infile = source->pub.input_file; + register JSAMPROW ptr; + register JSAMPLE *rescale = source->rescale; + JDIMENSION col; + + ptr = source->pub.buffer[0]; + for (col = cinfo->image_width; col > 0; col--) { + *ptr++ = rescale[read_pbm_integer(cinfo, infile)]; + } + return 1; +} + + +METHODDEF(JDIMENSION) +get_text_rgb_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +/* This version is for reading text-format PPM files with any maxval */ +{ + ppm_source_ptr source = (ppm_source_ptr) sinfo; + FILE * infile = source->pub.input_file; + register JSAMPROW ptr; + register JSAMPLE *rescale = source->rescale; + JDIMENSION col; + + ptr = source->pub.buffer[0]; + for (col = cinfo->image_width; col > 0; col--) { + *ptr++ = rescale[read_pbm_integer(cinfo, infile)]; + *ptr++ = rescale[read_pbm_integer(cinfo, infile)]; + *ptr++ = rescale[read_pbm_integer(cinfo, infile)]; + } + return 1; +} + + +METHODDEF(JDIMENSION) +get_scaled_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +/* This version is for reading raw-byte-format PGM files with any maxval */ +{ + ppm_source_ptr source = (ppm_source_ptr) sinfo; + register JSAMPROW ptr; + register U_CHAR * bufferptr; + register JSAMPLE *rescale = source->rescale; + JDIMENSION col; + + if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) + ERREXIT(cinfo, JERR_INPUT_EOF); + ptr = source->pub.buffer[0]; + bufferptr = source->iobuffer; + for (col = cinfo->image_width; col > 0; col--) { + *ptr++ = rescale[UCH(*bufferptr++)]; + } + return 1; +} + + +METHODDEF(JDIMENSION) +get_scaled_rgb_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +/* This version is for reading raw-byte-format PPM files with any maxval */ +{ + ppm_source_ptr source = (ppm_source_ptr) sinfo; + register JSAMPROW ptr; + register U_CHAR * bufferptr; + register JSAMPLE *rescale = source->rescale; + JDIMENSION col; + + if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) + ERREXIT(cinfo, JERR_INPUT_EOF); + ptr = source->pub.buffer[0]; + bufferptr = source->iobuffer; + for (col = cinfo->image_width; col > 0; col--) { + *ptr++ = rescale[UCH(*bufferptr++)]; + *ptr++ = rescale[UCH(*bufferptr++)]; + *ptr++ = rescale[UCH(*bufferptr++)]; + } + return 1; +} + + +METHODDEF(JDIMENSION) +get_raw_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +/* This version is for reading raw-byte-format files with maxval = MAXJSAMPLE. + * In this case we just read right into the JSAMPLE buffer! + * Note that same code works for PPM and PGM files. + */ +{ + ppm_source_ptr source = (ppm_source_ptr) sinfo; + + if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) + ERREXIT(cinfo, JERR_INPUT_EOF); + return 1; +} + + +METHODDEF(JDIMENSION) +get_word_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +/* This version is for reading raw-word-format PGM files with any maxval */ +{ + ppm_source_ptr source = (ppm_source_ptr) sinfo; + register JSAMPROW ptr; + register U_CHAR * bufferptr; + register JSAMPLE *rescale = source->rescale; + JDIMENSION col; + + if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) + ERREXIT(cinfo, JERR_INPUT_EOF); + ptr = source->pub.buffer[0]; + bufferptr = source->iobuffer; + for (col = cinfo->image_width; col > 0; col--) { + register int temp; + temp = UCH(*bufferptr++) << 8; + temp |= UCH(*bufferptr++); + *ptr++ = rescale[temp]; + } + return 1; +} + + +METHODDEF(JDIMENSION) +get_word_rgb_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +/* This version is for reading raw-word-format PPM files with any maxval */ +{ + ppm_source_ptr source = (ppm_source_ptr) sinfo; + register JSAMPROW ptr; + register U_CHAR * bufferptr; + register JSAMPLE *rescale = source->rescale; + JDIMENSION col; + + if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) + ERREXIT(cinfo, JERR_INPUT_EOF); + ptr = source->pub.buffer[0]; + bufferptr = source->iobuffer; + for (col = cinfo->image_width; col > 0; col--) { + register int temp; + temp = UCH(*bufferptr++) << 8; + temp |= UCH(*bufferptr++); + *ptr++ = rescale[temp]; + temp = UCH(*bufferptr++) << 8; + temp |= UCH(*bufferptr++); + *ptr++ = rescale[temp]; + temp = UCH(*bufferptr++) << 8; + temp |= UCH(*bufferptr++); + *ptr++ = rescale[temp]; + } + return 1; +} + + +/* + * Read the file header; return image size and component count. + */ + +METHODDEF(void) +start_input_ppm (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +{ + ppm_source_ptr source = (ppm_source_ptr) sinfo; + int c; + unsigned int w, h, maxval; + boolean need_iobuffer, use_raw_buffer, need_rescale; + + if (getc(source->pub.input_file) != 'P') + ERREXIT(cinfo, JERR_PPM_NOT); + + c = getc(source->pub.input_file); /* subformat discriminator character */ + + /* detect unsupported variants (ie, PBM) before trying to read header */ + switch (c) { + case '2': /* it's a text-format PGM file */ + case '3': /* it's a text-format PPM file */ + case '5': /* it's a raw-format PGM file */ + case '6': /* it's a raw-format PPM file */ + break; + default: + ERREXIT(cinfo, JERR_PPM_NOT); + break; + } + + /* fetch the remaining header info */ + w = read_pbm_integer(cinfo, source->pub.input_file); + h = read_pbm_integer(cinfo, source->pub.input_file); + maxval = read_pbm_integer(cinfo, source->pub.input_file); + + if (w <= 0 || h <= 0 || maxval <= 0) /* error check */ + ERREXIT(cinfo, JERR_PPM_NOT); + + cinfo->data_precision = BITS_IN_JSAMPLE; /* we always rescale data to this */ + cinfo->image_width = (JDIMENSION) w; + cinfo->image_height = (JDIMENSION) h; + + /* initialize flags to most common settings */ + need_iobuffer = TRUE; /* do we need an I/O buffer? */ + use_raw_buffer = FALSE; /* do we map input buffer onto I/O buffer? */ + need_rescale = TRUE; /* do we need a rescale array? */ + + switch (c) { + case '2': /* it's a text-format PGM file */ + cinfo->input_components = 1; + cinfo->in_color_space = JCS_GRAYSCALE; + TRACEMS2(cinfo, 1, JTRC_PGM_TEXT, w, h); + source->pub.get_pixel_rows = get_text_gray_row; + need_iobuffer = FALSE; + break; + + case '3': /* it's a text-format PPM file */ + cinfo->input_components = 3; + cinfo->in_color_space = JCS_RGB; + TRACEMS2(cinfo, 1, JTRC_PPM_TEXT, w, h); + source->pub.get_pixel_rows = get_text_rgb_row; + need_iobuffer = FALSE; + break; + + case '5': /* it's a raw-format PGM file */ + cinfo->input_components = 1; + cinfo->in_color_space = JCS_GRAYSCALE; + TRACEMS2(cinfo, 1, JTRC_PGM, w, h); + if (maxval > 255) { + source->pub.get_pixel_rows = get_word_gray_row; + } else if (maxval == MAXJSAMPLE && SIZEOF(JSAMPLE) == SIZEOF(U_CHAR)) { + source->pub.get_pixel_rows = get_raw_row; + use_raw_buffer = TRUE; + need_rescale = FALSE; + } else { + source->pub.get_pixel_rows = get_scaled_gray_row; + } + break; + + case '6': /* it's a raw-format PPM file */ + cinfo->input_components = 3; + cinfo->in_color_space = JCS_RGB; + TRACEMS2(cinfo, 1, JTRC_PPM, w, h); + if (maxval > 255) { + source->pub.get_pixel_rows = get_word_rgb_row; + } else if (maxval == MAXJSAMPLE && SIZEOF(JSAMPLE) == SIZEOF(U_CHAR)) { + source->pub.get_pixel_rows = get_raw_row; + use_raw_buffer = TRUE; + need_rescale = FALSE; + } else { + source->pub.get_pixel_rows = get_scaled_rgb_row; + } + break; + } + + /* Allocate space for I/O buffer: 1 or 3 bytes or words/pixel. */ + if (need_iobuffer) { + source->buffer_width = (size_t) w * cinfo->input_components * + ((maxval<=255) ? SIZEOF(U_CHAR) : (2*SIZEOF(U_CHAR))); + source->iobuffer = (U_CHAR *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + source->buffer_width); + } + + /* Create compressor input buffer. */ + if (use_raw_buffer) { + /* For unscaled raw-input case, we can just map it onto the I/O buffer. */ + /* Synthesize a JSAMPARRAY pointer structure */ + /* Cast here implies near->far pointer conversion on PCs */ + source->pixrow = (JSAMPROW) source->iobuffer; + source->pub.buffer = & source->pixrow; + source->pub.buffer_height = 1; + } else { + /* Need to translate anyway, so make a separate sample buffer. */ + source->pub.buffer = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) w * cinfo->input_components, (JDIMENSION) 1); + source->pub.buffer_height = 1; + } + + /* Compute the rescaling array if required. */ + if (need_rescale) { + INT32 val, half_maxval; + + /* On 16-bit-int machines we have to be careful of maxval = 65535 */ + source->rescale = (JSAMPLE *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (size_t) (((long) maxval + 1L) * SIZEOF(JSAMPLE))); + half_maxval = maxval / 2; + for (val = 0; val <= (INT32) maxval; val++) { + /* The multiplication here must be done in 32 bits to avoid overflow */ + source->rescale[val] = (JSAMPLE) ((val*MAXJSAMPLE + half_maxval)/maxval); + } + } +} + + +/* + * Finish up at the end of the file. + */ + +METHODDEF(void) +finish_input_ppm (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +{ + /* no work */ +} + + +/* + * The module selection routine for PPM format input. + */ + +GLOBAL(cjpeg_source_ptr) +jinit_read_ppm (j_compress_ptr cinfo) +{ + ppm_source_ptr source; + + /* Create module interface object */ + source = (ppm_source_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(ppm_source_struct)); + /* Fill in method ptrs, except get_pixel_rows which start_input sets */ + source->pub.start_input = start_input_ppm; + source->pub.finish_input = finish_input_ppm; + + return (cjpeg_source_ptr) source; +} + +#endif /* PPM_SUPPORTED */ diff --git a/jpeg-8c/rdrle.c b/jpeg-8c/rdrle.c new file mode 100644 index 00000000..542bc374 --- /dev/null +++ b/jpeg-8c/rdrle.c @@ -0,0 +1,387 @@ +/* + * rdrle.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 routines to read input images in Utah RLE format. + * The Utah Raster Toolkit library is required (version 3.1 or later). + * + * These routines may need modification for non-Unix environments or + * specialized applications. As they stand, they assume input from + * an ordinary stdio stream. They further assume that reading begins + * at the start of the file; start_input may need work if the + * user interface has already read some data (e.g., to determine that + * the file is indeed RLE format). + * + * Based on code contributed by Mike Lijewski, + * with updates from Robert Hutchinson. + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ + +#ifdef RLE_SUPPORTED + +/* rle.h is provided by the Utah Raster Toolkit. */ + +#include + +/* + * We assume that JSAMPLE has the same representation as rle_pixel, + * to wit, "unsigned char". Hence we can't cope with 12- or 16-bit samples. + */ + +#if BITS_IN_JSAMPLE != 8 + Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */ +#endif + +/* + * We support the following types of RLE files: + * + * GRAYSCALE - 8 bits, no colormap + * MAPPEDGRAY - 8 bits, 1 channel colomap + * PSEUDOCOLOR - 8 bits, 3 channel colormap + * TRUECOLOR - 24 bits, 3 channel colormap + * DIRECTCOLOR - 24 bits, no colormap + * + * For now, we ignore any alpha channel in the image. + */ + +typedef enum + { GRAYSCALE, MAPPEDGRAY, PSEUDOCOLOR, TRUECOLOR, DIRECTCOLOR } rle_kind; + + +/* + * Since RLE stores scanlines bottom-to-top, we have to invert the image + * to conform to JPEG's top-to-bottom order. To do this, we read the + * incoming image into a virtual array on the first get_pixel_rows call, + * then fetch the required row from the virtual array on subsequent calls. + */ + +typedef struct _rle_source_struct * rle_source_ptr; + +typedef struct _rle_source_struct { + struct cjpeg_source_struct pub; /* public fields */ + + rle_kind visual; /* actual type of input file */ + jvirt_sarray_ptr image; /* virtual array to hold the image */ + JDIMENSION row; /* current row # in the virtual array */ + rle_hdr header; /* Input file information */ + rle_pixel** rle_row; /* holds a row returned by rle_getrow() */ + +} rle_source_struct; + + +/* + * Read the file header; return image size and component count. + */ + +METHODDEF(void) +start_input_rle (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +{ + rle_source_ptr source = (rle_source_ptr) sinfo; + JDIMENSION width, height; +#ifdef PROGRESS_REPORT + cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; +#endif + + /* Use RLE library routine to get the header info */ + source->header = *rle_hdr_init(NULL); + source->header.rle_file = source->pub.input_file; + switch (rle_get_setup(&(source->header))) { + case RLE_SUCCESS: + /* A-OK */ + break; + case RLE_NOT_RLE: + ERREXIT(cinfo, JERR_RLE_NOT); + break; + case RLE_NO_SPACE: + ERREXIT(cinfo, JERR_RLE_MEM); + break; + case RLE_EMPTY: + ERREXIT(cinfo, JERR_RLE_EMPTY); + break; + case RLE_EOF: + ERREXIT(cinfo, JERR_RLE_EOF); + break; + default: + ERREXIT(cinfo, JERR_RLE_BADERROR); + break; + } + + /* Figure out what we have, set private vars and return values accordingly */ + + width = source->header.xmax - source->header.xmin + 1; + height = source->header.ymax - source->header.ymin + 1; + source->header.xmin = 0; /* realign horizontally */ + source->header.xmax = width-1; + + cinfo->image_width = width; + cinfo->image_height = height; + cinfo->data_precision = 8; /* we can only handle 8 bit data */ + + if (source->header.ncolors == 1 && source->header.ncmap == 0) { + source->visual = GRAYSCALE; + TRACEMS2(cinfo, 1, JTRC_RLE_GRAY, width, height); + } else if (source->header.ncolors == 1 && source->header.ncmap == 1) { + source->visual = MAPPEDGRAY; + TRACEMS3(cinfo, 1, JTRC_RLE_MAPGRAY, width, height, + 1 << source->header.cmaplen); + } else if (source->header.ncolors == 1 && source->header.ncmap == 3) { + source->visual = PSEUDOCOLOR; + TRACEMS3(cinfo, 1, JTRC_RLE_MAPPED, width, height, + 1 << source->header.cmaplen); + } else if (source->header.ncolors == 3 && source->header.ncmap == 3) { + source->visual = TRUECOLOR; + TRACEMS3(cinfo, 1, JTRC_RLE_FULLMAP, width, height, + 1 << source->header.cmaplen); + } else if (source->header.ncolors == 3 && source->header.ncmap == 0) { + source->visual = DIRECTCOLOR; + TRACEMS2(cinfo, 1, JTRC_RLE, width, height); + } else + ERREXIT(cinfo, JERR_RLE_UNSUPPORTED); + + if (source->visual == GRAYSCALE || source->visual == MAPPEDGRAY) { + cinfo->in_color_space = JCS_GRAYSCALE; + cinfo->input_components = 1; + } else { + cinfo->in_color_space = JCS_RGB; + cinfo->input_components = 3; + } + + /* + * A place to hold each scanline while it's converted. + * (GRAYSCALE scanlines don't need converting) + */ + if (source->visual != GRAYSCALE) { + source->rle_row = (rle_pixel**) (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) width, (JDIMENSION) cinfo->input_components); + } + + /* request a virtual array to hold the image */ + source->image = (*cinfo->mem->request_virt_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, + (JDIMENSION) (width * source->header.ncolors), + (JDIMENSION) height, (JDIMENSION) 1); + +#ifdef PROGRESS_REPORT + if (progress != NULL) { + /* count file input as separate pass */ + progress->total_extra_passes++; + } +#endif + + source->pub.buffer_height = 1; +} + + +/* + * Read one row of pixels. + * Called only after load_image has read the image into the virtual array. + * Used for GRAYSCALE, MAPPEDGRAY, TRUECOLOR, and DIRECTCOLOR images. + */ + +METHODDEF(JDIMENSION) +get_rle_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +{ + rle_source_ptr source = (rle_source_ptr) sinfo; + + source->row--; + source->pub.buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, source->image, source->row, (JDIMENSION) 1, FALSE); + + return 1; +} + +/* + * Read one row of pixels. + * Called only after load_image has read the image into the virtual array. + * Used for PSEUDOCOLOR images. + */ + +METHODDEF(JDIMENSION) +get_pseudocolor_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +{ + rle_source_ptr source = (rle_source_ptr) sinfo; + JSAMPROW src_row, dest_row; + JDIMENSION col; + rle_map *colormap; + int val; + + colormap = source->header.cmap; + dest_row = source->pub.buffer[0]; + source->row--; + src_row = * (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, source->image, source->row, (JDIMENSION) 1, FALSE); + + for (col = cinfo->image_width; col > 0; col--) { + val = GETJSAMPLE(*src_row++); + *dest_row++ = (JSAMPLE) (colormap[val ] >> 8); + *dest_row++ = (JSAMPLE) (colormap[val + 256] >> 8); + *dest_row++ = (JSAMPLE) (colormap[val + 512] >> 8); + } + + return 1; +} + + +/* + * Load the image into a virtual array. We have to do this because RLE + * files start at the lower left while the JPEG standard has them starting + * in the upper left. This is called the first time we want to get a row + * of input. What we do is load the RLE data into the array and then call + * the appropriate routine to read one row from the array. Before returning, + * we set source->pub.get_pixel_rows so that subsequent calls go straight to + * the appropriate row-reading routine. + */ + +METHODDEF(JDIMENSION) +load_image (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +{ + rle_source_ptr source = (rle_source_ptr) sinfo; + JDIMENSION row, col; + JSAMPROW scanline, red_ptr, green_ptr, blue_ptr; + rle_pixel **rle_row; + rle_map *colormap; + char channel; +#ifdef PROGRESS_REPORT + cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; +#endif + + colormap = source->header.cmap; + rle_row = source->rle_row; + + /* Read the RLE data into our virtual array. + * We assume here that (a) rle_pixel is represented the same as JSAMPLE, + * and (b) we are not on a machine where FAR pointers differ from regular. + */ + RLE_CLR_BIT(source->header, RLE_ALPHA); /* don't read the alpha channel */ + +#ifdef PROGRESS_REPORT + if (progress != NULL) { + progress->pub.pass_limit = cinfo->image_height; + progress->pub.pass_counter = 0; + (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); + } +#endif + + switch (source->visual) { + + case GRAYSCALE: + case PSEUDOCOLOR: + for (row = 0; row < cinfo->image_height; row++) { + rle_row = (rle_pixel **) (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, source->image, row, (JDIMENSION) 1, TRUE); + rle_getrow(&source->header, rle_row); +#ifdef PROGRESS_REPORT + if (progress != NULL) { + progress->pub.pass_counter++; + (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); + } +#endif + } + break; + + case MAPPEDGRAY: + case TRUECOLOR: + for (row = 0; row < cinfo->image_height; row++) { + scanline = * (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, source->image, row, (JDIMENSION) 1, TRUE); + rle_row = source->rle_row; + rle_getrow(&source->header, rle_row); + + for (col = 0; col < cinfo->image_width; col++) { + for (channel = 0; channel < source->header.ncolors; channel++) { + *scanline++ = (JSAMPLE) + (colormap[GETJSAMPLE(rle_row[channel][col]) + 256 * channel] >> 8); + } + } + +#ifdef PROGRESS_REPORT + if (progress != NULL) { + progress->pub.pass_counter++; + (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); + } +#endif + } + break; + + case DIRECTCOLOR: + for (row = 0; row < cinfo->image_height; row++) { + scanline = * (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, source->image, row, (JDIMENSION) 1, TRUE); + rle_getrow(&source->header, rle_row); + + red_ptr = rle_row[0]; + green_ptr = rle_row[1]; + blue_ptr = rle_row[2]; + + for (col = cinfo->image_width; col > 0; col--) { + *scanline++ = *red_ptr++; + *scanline++ = *green_ptr++; + *scanline++ = *blue_ptr++; + } + +#ifdef PROGRESS_REPORT + if (progress != NULL) { + progress->pub.pass_counter++; + (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); + } +#endif + } + } + +#ifdef PROGRESS_REPORT + if (progress != NULL) + progress->completed_extra_passes++; +#endif + + /* Set up to call proper row-extraction routine in future */ + if (source->visual == PSEUDOCOLOR) { + source->pub.buffer = source->rle_row; + source->pub.get_pixel_rows = get_pseudocolor_row; + } else { + source->pub.get_pixel_rows = get_rle_row; + } + source->row = cinfo->image_height; + + /* And fetch the topmost (bottommost) row */ + return (*source->pub.get_pixel_rows) (cinfo, sinfo); +} + + +/* + * Finish up at the end of the file. + */ + +METHODDEF(void) +finish_input_rle (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +{ + /* no work */ +} + + +/* + * The module selection routine for RLE format input. + */ + +GLOBAL(cjpeg_source_ptr) +jinit_read_rle (j_compress_ptr cinfo) +{ + rle_source_ptr source; + + /* Create module interface object */ + source = (rle_source_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(rle_source_struct)); + /* Fill in method ptrs */ + source->pub.start_input = start_input_rle; + source->pub.finish_input = finish_input_rle; + source->pub.get_pixel_rows = load_image; + + return (cjpeg_source_ptr) source; +} + +#endif /* RLE_SUPPORTED */ diff --git a/jpeg-8c/rdswitch.c b/jpeg-8c/rdswitch.c new file mode 100644 index 00000000..7a839af7 --- /dev/null +++ b/jpeg-8c/rdswitch.c @@ -0,0 +1,365 @@ +/* + * rdswitch.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 routines to process some of cjpeg's more complicated + * command-line switches. Switches processed here are: + * -qtables file Read quantization tables from text file + * -scans file Read scan script from text file + * -quality N[,N,...] Set quality ratings + * -qslots N[,N,...] Set component quantization table selectors + * -sample HxV[,HxV,...] Set component sampling factors + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ +#include /* to declare isdigit(), isspace() */ + + +LOCAL(int) +text_getc (FILE * file) +/* Read next char, skipping over any comments (# to end of line) */ +/* A comment/newline sequence is returned as a newline */ +{ + register int ch; + + ch = getc(file); + if (ch == '#') { + do { + ch = getc(file); + } while (ch != '\n' && ch != EOF); + } + return ch; +} + + +LOCAL(boolean) +read_text_integer (FILE * file, long * result, int * termchar) +/* Read an unsigned decimal integer from a file, store it in result */ +/* Reads one trailing character after the integer; returns it in termchar */ +{ + register int ch; + register long val; + + /* Skip any leading whitespace, detect EOF */ + do { + ch = text_getc(file); + if (ch == EOF) { + *termchar = ch; + return FALSE; + } + } while (isspace(ch)); + + if (! isdigit(ch)) { + *termchar = ch; + return FALSE; + } + + val = ch - '0'; + while ((ch = text_getc(file)) != EOF) { + if (! isdigit(ch)) + break; + val *= 10; + val += ch - '0'; + } + *result = val; + *termchar = ch; + return TRUE; +} + + +GLOBAL(boolean) +read_quant_tables (j_compress_ptr cinfo, char * filename, boolean force_baseline) +/* Read a set of quantization tables from the specified file. + * The file is plain ASCII text: decimal numbers with whitespace between. + * Comments preceded by '#' may be included in the file. + * There may be one to NUM_QUANT_TBLS tables in the file, each of 64 values. + * The tables are implicitly numbered 0,1,etc. + * NOTE: does not affect the qslots mapping, which will default to selecting + * table 0 for luminance (or primary) components, 1 for chrominance components. + * You must use -qslots if you want a different component->table mapping. + */ +{ + FILE * fp; + int tblno, i, termchar; + long val; + unsigned int table[DCTSIZE2]; + + if ((fp = fopen(filename, "r")) == NULL) { + fprintf(stderr, "Can't open table file %s\n", filename); + return FALSE; + } + tblno = 0; + + while (read_text_integer(fp, &val, &termchar)) { /* read 1st element of table */ + if (tblno >= NUM_QUANT_TBLS) { + fprintf(stderr, "Too many tables in file %s\n", filename); + fclose(fp); + return FALSE; + } + table[0] = (unsigned int) val; + for (i = 1; i < DCTSIZE2; i++) { + if (! read_text_integer(fp, &val, &termchar)) { + fprintf(stderr, "Invalid table data in file %s\n", filename); + fclose(fp); + return FALSE; + } + table[i] = (unsigned int) val; + } + jpeg_add_quant_table(cinfo, tblno, table, cinfo->q_scale_factor[tblno], + force_baseline); + tblno++; + } + + if (termchar != EOF) { + fprintf(stderr, "Non-numeric data in file %s\n", filename); + fclose(fp); + return FALSE; + } + + fclose(fp); + return TRUE; +} + + +#ifdef C_MULTISCAN_FILES_SUPPORTED + +LOCAL(boolean) +read_scan_integer (FILE * file, long * result, int * termchar) +/* Variant of read_text_integer that always looks for a non-space termchar; + * this simplifies parsing of punctuation in scan scripts. + */ +{ + register int ch; + + if (! read_text_integer(file, result, termchar)) + return FALSE; + ch = *termchar; + while (ch != EOF && isspace(ch)) + ch = text_getc(file); + if (isdigit(ch)) { /* oops, put it back */ + if (ungetc(ch, file) == EOF) + return FALSE; + ch = ' '; + } else { + /* Any separators other than ';' and ':' are ignored; + * this allows user to insert commas, etc, if desired. + */ + if (ch != EOF && ch != ';' && ch != ':') + ch = ' '; + } + *termchar = ch; + return TRUE; +} + + +GLOBAL(boolean) +read_scan_script (j_compress_ptr cinfo, char * filename) +/* Read a scan script from the specified text file. + * Each entry in the file defines one scan to be emitted. + * Entries are separated by semicolons ';'. + * An entry contains one to four component indexes, + * optionally followed by a colon ':' and four progressive-JPEG parameters. + * The component indexes denote which component(s) are to be transmitted + * in the current scan. The first component has index 0. + * Sequential JPEG is used if the progressive-JPEG parameters are omitted. + * The file is free format text: any whitespace may appear between numbers + * and the ':' and ';' punctuation marks. Also, other punctuation (such + * as commas or dashes) can be placed between numbers if desired. + * Comments preceded by '#' may be included in the file. + * Note: we do very little validity checking here; + * jcmaster.c will validate the script parameters. + */ +{ + FILE * fp; + int scanno, ncomps, termchar; + long val; + jpeg_scan_info * scanptr; +#define MAX_SCANS 100 /* quite arbitrary limit */ + jpeg_scan_info scans[MAX_SCANS]; + + if ((fp = fopen(filename, "r")) == NULL) { + fprintf(stderr, "Can't open scan definition file %s\n", filename); + return FALSE; + } + scanptr = scans; + scanno = 0; + + while (read_scan_integer(fp, &val, &termchar)) { + if (scanno >= MAX_SCANS) { + fprintf(stderr, "Too many scans defined in file %s\n", filename); + fclose(fp); + return FALSE; + } + scanptr->component_index[0] = (int) val; + ncomps = 1; + while (termchar == ' ') { + if (ncomps >= MAX_COMPS_IN_SCAN) { + fprintf(stderr, "Too many components in one scan in file %s\n", + filename); + fclose(fp); + return FALSE; + } + if (! read_scan_integer(fp, &val, &termchar)) + goto bogus; + scanptr->component_index[ncomps] = (int) val; + ncomps++; + } + scanptr->comps_in_scan = ncomps; + if (termchar == ':') { + if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ') + goto bogus; + scanptr->Ss = (int) val; + if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ') + goto bogus; + scanptr->Se = (int) val; + if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ') + goto bogus; + scanptr->Ah = (int) val; + if (! read_scan_integer(fp, &val, &termchar)) + goto bogus; + scanptr->Al = (int) val; + } else { + /* set non-progressive parameters */ + scanptr->Ss = 0; + scanptr->Se = DCTSIZE2-1; + scanptr->Ah = 0; + scanptr->Al = 0; + } + if (termchar != ';' && termchar != EOF) { +bogus: + fprintf(stderr, "Invalid scan entry format in file %s\n", filename); + fclose(fp); + return FALSE; + } + scanptr++, scanno++; + } + + if (termchar != EOF) { + fprintf(stderr, "Non-numeric data in file %s\n", filename); + fclose(fp); + return FALSE; + } + + if (scanno > 0) { + /* Stash completed scan list in cinfo structure. + * NOTE: for cjpeg's use, JPOOL_IMAGE is the right lifetime for this data, + * but if you want to compress multiple images you'd want JPOOL_PERMANENT. + */ + scanptr = (jpeg_scan_info *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + scanno * SIZEOF(jpeg_scan_info)); + MEMCOPY(scanptr, scans, scanno * SIZEOF(jpeg_scan_info)); + cinfo->scan_info = scanptr; + cinfo->num_scans = scanno; + } + + fclose(fp); + return TRUE; +} + +#endif /* C_MULTISCAN_FILES_SUPPORTED */ + + +GLOBAL(boolean) +set_quality_ratings (j_compress_ptr cinfo, char *arg, boolean force_baseline) +/* Process a quality-ratings parameter string, of the form + * N[,N,...] + * If there are more q-table slots than parameters, the last value is replicated. + */ +{ + int val = 75; /* default value */ + int tblno; + char ch; + + for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) { + if (*arg) { + ch = ','; /* if not set by sscanf, will be ',' */ + if (sscanf(arg, "%d%c", &val, &ch) < 1) + return FALSE; + if (ch != ',') /* syntax check */ + return FALSE; + /* Convert user 0-100 rating to percentage scaling */ + cinfo->q_scale_factor[tblno] = jpeg_quality_scaling(val); + while (*arg && *arg++ != ',') /* advance to next segment of arg string */ + ; + } else { + /* reached end of parameter, set remaining factors to last value */ + cinfo->q_scale_factor[tblno] = jpeg_quality_scaling(val); + } + } + jpeg_default_qtables(cinfo, force_baseline); + return TRUE; +} + + +GLOBAL(boolean) +set_quant_slots (j_compress_ptr cinfo, char *arg) +/* Process a quantization-table-selectors parameter string, of the form + * N[,N,...] + * If there are more components than parameters, the last value is replicated. + */ +{ + int val = 0; /* default table # */ + int ci; + char ch; + + for (ci = 0; ci < MAX_COMPONENTS; ci++) { + if (*arg) { + ch = ','; /* if not set by sscanf, will be ',' */ + if (sscanf(arg, "%d%c", &val, &ch) < 1) + return FALSE; + if (ch != ',') /* syntax check */ + return FALSE; + if (val < 0 || val >= NUM_QUANT_TBLS) { + fprintf(stderr, "JPEG quantization tables are numbered 0..%d\n", + NUM_QUANT_TBLS-1); + return FALSE; + } + cinfo->comp_info[ci].quant_tbl_no = val; + while (*arg && *arg++ != ',') /* advance to next segment of arg string */ + ; + } else { + /* reached end of parameter, set remaining components to last table */ + cinfo->comp_info[ci].quant_tbl_no = val; + } + } + return TRUE; +} + + +GLOBAL(boolean) +set_sample_factors (j_compress_ptr cinfo, char *arg) +/* Process a sample-factors parameter string, of the form + * HxV[,HxV,...] + * If there are more components than parameters, "1x1" is assumed for the rest. + */ +{ + int ci, val1, val2; + char ch1, ch2; + + for (ci = 0; ci < MAX_COMPONENTS; ci++) { + if (*arg) { + ch2 = ','; /* if not set by sscanf, will be ',' */ + if (sscanf(arg, "%d%c%d%c", &val1, &ch1, &val2, &ch2) < 3) + return FALSE; + if ((ch1 != 'x' && ch1 != 'X') || ch2 != ',') /* syntax check */ + return FALSE; + if (val1 <= 0 || val1 > 4 || val2 <= 0 || val2 > 4) { + fprintf(stderr, "JPEG sampling factors must be 1..4\n"); + return FALSE; + } + cinfo->comp_info[ci].h_samp_factor = val1; + cinfo->comp_info[ci].v_samp_factor = val2; + while (*arg && *arg++ != ',') /* advance to next segment of arg string */ + ; + } else { + /* reached end of parameter, set remaining components to 1x1 sampling */ + cinfo->comp_info[ci].h_samp_factor = 1; + cinfo->comp_info[ci].v_samp_factor = 1; + } + } + return TRUE; +} diff --git a/jpeg-8c/rdtarga.c b/jpeg-8c/rdtarga.c new file mode 100644 index 00000000..4c2cd267 --- /dev/null +++ b/jpeg-8c/rdtarga.c @@ -0,0 +1,500 @@ +/* + * rdtarga.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 routines to read input images in Targa format. + * + * These routines may need modification for non-Unix environments or + * specialized applications. As they stand, they assume input from + * an ordinary stdio stream. They further assume that reading begins + * at the start of the file; start_input may need work if the + * user interface has already read some data (e.g., to determine that + * the file is indeed Targa format). + * + * Based on code contributed by Lee Daniel Crocker. + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ + +#ifdef TARGA_SUPPORTED + + +/* Macros to deal with unsigned chars as efficiently as compiler allows */ + +#ifdef HAVE_UNSIGNED_CHAR +typedef unsigned char U_CHAR; +#define UCH(x) ((int) (x)) +#else /* !HAVE_UNSIGNED_CHAR */ +#ifdef CHAR_IS_UNSIGNED +typedef char U_CHAR; +#define UCH(x) ((int) (x)) +#else +typedef char U_CHAR; +#define UCH(x) ((int) (x) & 0xFF) +#endif +#endif /* HAVE_UNSIGNED_CHAR */ + + +#define ReadOK(file,buffer,len) (JFREAD(file,buffer,len) == ((size_t) (len))) + + +/* Private version of data source object */ + +typedef struct _tga_source_struct * tga_source_ptr; + +typedef struct _tga_source_struct { + struct cjpeg_source_struct pub; /* public fields */ + + j_compress_ptr cinfo; /* back link saves passing separate parm */ + + JSAMPARRAY colormap; /* Targa colormap (converted to my format) */ + + jvirt_sarray_ptr whole_image; /* Needed if funny input row order */ + JDIMENSION current_row; /* Current logical row number to read */ + + /* Pointer to routine to extract next Targa pixel from input file */ + JMETHOD(void, read_pixel, (tga_source_ptr sinfo)); + + /* Result of read_pixel is delivered here: */ + U_CHAR tga_pixel[4]; + + int pixel_size; /* Bytes per Targa pixel (1 to 4) */ + + /* State info for reading RLE-coded pixels; both counts must be init to 0 */ + int block_count; /* # of pixels remaining in RLE block */ + int dup_pixel_count; /* # of times to duplicate previous pixel */ + + /* This saves the correct pixel-row-expansion method for preload_image */ + JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo, + cjpeg_source_ptr sinfo)); +} tga_source_struct; + + +/* For expanding 5-bit pixel values to 8-bit with best rounding */ + +static const UINT8 c5to8bits[32] = { + 0, 8, 16, 25, 33, 41, 49, 58, + 66, 74, 82, 90, 99, 107, 115, 123, + 132, 140, 148, 156, 165, 173, 181, 189, + 197, 206, 214, 222, 230, 239, 247, 255 +}; + + + +LOCAL(int) +read_byte (tga_source_ptr sinfo) +/* Read next byte from Targa file */ +{ + register FILE *infile = sinfo->pub.input_file; + register int c; + + if ((c = getc(infile)) == EOF) + ERREXIT(sinfo->cinfo, JERR_INPUT_EOF); + return c; +} + + +LOCAL(void) +read_colormap (tga_source_ptr sinfo, int cmaplen, int mapentrysize) +/* Read the colormap from a Targa file */ +{ + int i; + + /* Presently only handles 24-bit BGR format */ + if (mapentrysize != 24) + ERREXIT(sinfo->cinfo, JERR_TGA_BADCMAP); + + for (i = 0; i < cmaplen; i++) { + sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo); + sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo); + sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo); + } +} + + +/* + * read_pixel methods: get a single pixel from Targa file into tga_pixel[] + */ + +METHODDEF(void) +read_non_rle_pixel (tga_source_ptr sinfo) +/* Read one Targa pixel from the input file; no RLE expansion */ +{ + register FILE *infile = sinfo->pub.input_file; + register int i; + + for (i = 0; i < sinfo->pixel_size; i++) { + sinfo->tga_pixel[i] = (U_CHAR) getc(infile); + } +} + + +METHODDEF(void) +read_rle_pixel (tga_source_ptr sinfo) +/* Read one Targa pixel from the input file, expanding RLE data as needed */ +{ + register FILE *infile = sinfo->pub.input_file; + register int i; + + /* Duplicate previously read pixel? */ + if (sinfo->dup_pixel_count > 0) { + sinfo->dup_pixel_count--; + return; + } + + /* Time to read RLE block header? */ + if (--sinfo->block_count < 0) { /* decrement pixels remaining in block */ + i = read_byte(sinfo); + if (i & 0x80) { /* Start of duplicate-pixel block? */ + sinfo->dup_pixel_count = i & 0x7F; /* number of dups after this one */ + sinfo->block_count = 0; /* then read new block header */ + } else { + sinfo->block_count = i & 0x7F; /* number of pixels after this one */ + } + } + + /* Read next pixel */ + for (i = 0; i < sinfo->pixel_size; i++) { + sinfo->tga_pixel[i] = (U_CHAR) getc(infile); + } +} + + +/* + * Read one row of pixels. + * + * We provide several different versions depending on input file format. + */ + + +METHODDEF(JDIMENSION) +get_8bit_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +/* This version is for reading 8-bit grayscale pixels */ +{ + tga_source_ptr source = (tga_source_ptr) sinfo; + register JSAMPROW ptr; + register JDIMENSION col; + + ptr = source->pub.buffer[0]; + for (col = cinfo->image_width; col > 0; col--) { + (*source->read_pixel) (source); /* Load next pixel into tga_pixel */ + *ptr++ = (JSAMPLE) UCH(source->tga_pixel[0]); + } + return 1; +} + +METHODDEF(JDIMENSION) +get_8bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +/* This version is for reading 8-bit colormap indexes */ +{ + tga_source_ptr source = (tga_source_ptr) sinfo; + register int t; + register JSAMPROW ptr; + register JDIMENSION col; + register JSAMPARRAY colormap = source->colormap; + + ptr = source->pub.buffer[0]; + for (col = cinfo->image_width; col > 0; col--) { + (*source->read_pixel) (source); /* Load next pixel into tga_pixel */ + t = UCH(source->tga_pixel[0]); + *ptr++ = colormap[0][t]; + *ptr++ = colormap[1][t]; + *ptr++ = colormap[2][t]; + } + return 1; +} + +METHODDEF(JDIMENSION) +get_16bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +/* This version is for reading 16-bit pixels */ +{ + tga_source_ptr source = (tga_source_ptr) sinfo; + register int t; + register JSAMPROW ptr; + register JDIMENSION col; + + ptr = source->pub.buffer[0]; + for (col = cinfo->image_width; col > 0; col--) { + (*source->read_pixel) (source); /* Load next pixel into tga_pixel */ + t = UCH(source->tga_pixel[0]); + t += UCH(source->tga_pixel[1]) << 8; + /* We expand 5 bit data to 8 bit sample width. + * The format of the 16-bit (LSB first) input word is + * xRRRRRGGGGGBBBBB + */ + ptr[2] = (JSAMPLE) c5to8bits[t & 0x1F]; + t >>= 5; + ptr[1] = (JSAMPLE) c5to8bits[t & 0x1F]; + t >>= 5; + ptr[0] = (JSAMPLE) c5to8bits[t & 0x1F]; + ptr += 3; + } + return 1; +} + +METHODDEF(JDIMENSION) +get_24bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +/* This version is for reading 24-bit pixels */ +{ + tga_source_ptr source = (tga_source_ptr) sinfo; + register JSAMPROW ptr; + register JDIMENSION col; + + ptr = source->pub.buffer[0]; + for (col = cinfo->image_width; col > 0; col--) { + (*source->read_pixel) (source); /* Load next pixel into tga_pixel */ + *ptr++ = (JSAMPLE) UCH(source->tga_pixel[2]); /* change BGR to RGB order */ + *ptr++ = (JSAMPLE) UCH(source->tga_pixel[1]); + *ptr++ = (JSAMPLE) UCH(source->tga_pixel[0]); + } + return 1; +} + +/* + * Targa also defines a 32-bit pixel format with order B,G,R,A. + * We presently ignore the attribute byte, so the code for reading + * these pixels is identical to the 24-bit routine above. + * This works because the actual pixel length is only known to read_pixel. + */ + +#define get_32bit_row get_24bit_row + + +/* + * This method is for re-reading the input data in standard top-down + * row order. The entire image has already been read into whole_image + * with proper conversion of pixel format, but it's in a funny row order. + */ + +METHODDEF(JDIMENSION) +get_memory_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +{ + tga_source_ptr source = (tga_source_ptr) sinfo; + JDIMENSION source_row; + + /* Compute row of source that maps to current_row of normal order */ + /* For now, assume image is bottom-up and not interlaced. */ + /* NEEDS WORK to support interlaced images! */ + source_row = cinfo->image_height - source->current_row - 1; + + /* Fetch that row from virtual array */ + source->pub.buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, source->whole_image, + source_row, (JDIMENSION) 1, FALSE); + + source->current_row++; + return 1; +} + + +/* + * This method loads the image into whole_image during the first call on + * get_pixel_rows. The get_pixel_rows pointer is then adjusted to call + * get_memory_row on subsequent calls. + */ + +METHODDEF(JDIMENSION) +preload_image (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +{ + tga_source_ptr source = (tga_source_ptr) sinfo; + JDIMENSION row; + cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; + + /* Read the data into a virtual array in input-file row order. */ + for (row = 0; row < cinfo->image_height; row++) { + if (progress != NULL) { + progress->pub.pass_counter = (long) row; + progress->pub.pass_limit = (long) cinfo->image_height; + (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); + } + source->pub.buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, source->whole_image, row, (JDIMENSION) 1, TRUE); + (*source->get_pixel_rows) (cinfo, sinfo); + } + if (progress != NULL) + progress->completed_extra_passes++; + + /* Set up to read from the virtual array in unscrambled order */ + source->pub.get_pixel_rows = get_memory_row; + source->current_row = 0; + /* And read the first row */ + return get_memory_row(cinfo, sinfo); +} + + +/* + * Read the file header; return image size and component count. + */ + +METHODDEF(void) +start_input_tga (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +{ + tga_source_ptr source = (tga_source_ptr) sinfo; + U_CHAR targaheader[18]; + int idlen, cmaptype, subtype, flags, interlace_type, components; + unsigned int width, height, maplen; + boolean is_bottom_up; + +#define GET_2B(offset) ((unsigned int) UCH(targaheader[offset]) + \ + (((unsigned int) UCH(targaheader[offset+1])) << 8)) + + if (! ReadOK(source->pub.input_file, targaheader, 18)) + ERREXIT(cinfo, JERR_INPUT_EOF); + + /* Pretend "15-bit" pixels are 16-bit --- we ignore attribute bit anyway */ + if (targaheader[16] == 15) + targaheader[16] = 16; + + idlen = UCH(targaheader[0]); + cmaptype = UCH(targaheader[1]); + subtype = UCH(targaheader[2]); + maplen = GET_2B(5); + width = GET_2B(12); + height = GET_2B(14); + source->pixel_size = UCH(targaheader[16]) >> 3; + flags = UCH(targaheader[17]); /* Image Descriptor byte */ + + is_bottom_up = ((flags & 0x20) == 0); /* bit 5 set => top-down */ + interlace_type = flags >> 6; /* bits 6/7 are interlace code */ + + if (cmaptype > 1 || /* cmaptype must be 0 or 1 */ + source->pixel_size < 1 || source->pixel_size > 4 || + (UCH(targaheader[16]) & 7) != 0 || /* bits/pixel must be multiple of 8 */ + interlace_type != 0) /* currently don't allow interlaced image */ + ERREXIT(cinfo, JERR_TGA_BADPARMS); + + if (subtype > 8) { + /* It's an RLE-coded file */ + source->read_pixel = read_rle_pixel; + source->block_count = source->dup_pixel_count = 0; + subtype -= 8; + } else { + /* Non-RLE file */ + source->read_pixel = read_non_rle_pixel; + } + + /* Now should have subtype 1, 2, or 3 */ + components = 3; /* until proven different */ + cinfo->in_color_space = JCS_RGB; + + switch (subtype) { + case 1: /* Colormapped image */ + if (source->pixel_size == 1 && cmaptype == 1) + source->get_pixel_rows = get_8bit_row; + else + ERREXIT(cinfo, JERR_TGA_BADPARMS); + TRACEMS2(cinfo, 1, JTRC_TGA_MAPPED, width, height); + break; + case 2: /* RGB image */ + switch (source->pixel_size) { + case 2: + source->get_pixel_rows = get_16bit_row; + break; + case 3: + source->get_pixel_rows = get_24bit_row; + break; + case 4: + source->get_pixel_rows = get_32bit_row; + break; + default: + ERREXIT(cinfo, JERR_TGA_BADPARMS); + break; + } + TRACEMS2(cinfo, 1, JTRC_TGA, width, height); + break; + case 3: /* Grayscale image */ + components = 1; + cinfo->in_color_space = JCS_GRAYSCALE; + if (source->pixel_size == 1) + source->get_pixel_rows = get_8bit_gray_row; + else + ERREXIT(cinfo, JERR_TGA_BADPARMS); + TRACEMS2(cinfo, 1, JTRC_TGA_GRAY, width, height); + break; + default: + ERREXIT(cinfo, JERR_TGA_BADPARMS); + break; + } + + if (is_bottom_up) { + /* Create a virtual array to buffer the upside-down image. */ + source->whole_image = (*cinfo->mem->request_virt_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, + (JDIMENSION) width * components, (JDIMENSION) height, (JDIMENSION) 1); + if (cinfo->progress != NULL) { + cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; + progress->total_extra_passes++; /* count file input as separate pass */ + } + /* source->pub.buffer will point to the virtual array. */ + source->pub.buffer_height = 1; /* in case anyone looks at it */ + source->pub.get_pixel_rows = preload_image; + } else { + /* Don't need a virtual array, but do need a one-row input buffer. */ + source->whole_image = NULL; + source->pub.buffer = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) width * components, (JDIMENSION) 1); + source->pub.buffer_height = 1; + source->pub.get_pixel_rows = source->get_pixel_rows; + } + + while (idlen--) /* Throw away ID field */ + (void) read_byte(source); + + if (maplen > 0) { + if (maplen > 256 || GET_2B(3) != 0) + ERREXIT(cinfo, JERR_TGA_BADCMAP); + /* Allocate space to store the colormap */ + source->colormap = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, (JDIMENSION) maplen, (JDIMENSION) 3); + /* and read it from the file */ + read_colormap(source, (int) maplen, UCH(targaheader[7])); + } else { + if (cmaptype) /* but you promised a cmap! */ + ERREXIT(cinfo, JERR_TGA_BADPARMS); + source->colormap = NULL; + } + + cinfo->input_components = components; + cinfo->data_precision = 8; + cinfo->image_width = width; + cinfo->image_height = height; +} + + +/* + * Finish up at the end of the file. + */ + +METHODDEF(void) +finish_input_tga (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) +{ + /* no work */ +} + + +/* + * The module selection routine for Targa format input. + */ + +GLOBAL(cjpeg_source_ptr) +jinit_read_targa (j_compress_ptr cinfo) +{ + tga_source_ptr source; + + /* Create module interface object */ + source = (tga_source_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(tga_source_struct)); + source->cinfo = cinfo; /* make back link for subroutines */ + /* Fill in method ptrs, except get_pixel_rows which start_input sets */ + source->pub.start_input = start_input_tga; + source->pub.finish_input = finish_input_tga; + + return (cjpeg_source_ptr) source; +} + +#endif /* TARGA_SUPPORTED */ diff --git a/jpeg-8c/stamp-h1 b/jpeg-8c/stamp-h1 new file mode 100644 index 00000000..47553f4f --- /dev/null +++ b/jpeg-8c/stamp-h1 @@ -0,0 +1 @@ +timestamp for jconfig.h diff --git a/jpeg-8c/structure.txt b/jpeg-8c/structure.txt new file mode 100644 index 00000000..fe88701e --- /dev/null +++ b/jpeg-8c/structure.txt @@ -0,0 +1,945 @@ +IJG JPEG LIBRARY: SYSTEM ARCHITECTURE + +Copyright (C) 1991-2009, Thomas G. Lane, Guido Vollbeding. +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 an overview of the architecture of the IJG JPEG software; +that is, the functions of the various modules in the system and the interfaces +between modules. For more precise details about any data structure or calling +convention, see the include files and comments in the source code. + +We assume that the reader is already somewhat familiar with the JPEG standard. +The README file includes references for learning about JPEG. The file +libjpeg.txt describes the library from the viewpoint of an application +programmer using the library; it's best to read that file before this one. +Also, the file coderules.txt describes the coding style conventions we use. + +In this document, JPEG-specific terminology follows the JPEG standard: + A "component" means a color channel, e.g., Red or Luminance. + A "sample" is a single component value (i.e., one number in the image data). + A "coefficient" is a frequency coefficient (a DCT transform output number). + A "block" is an 8x8 group of samples or coefficients. + An "MCU" (minimum coded unit) is an interleaved set of blocks of size + determined by the sampling factors, or a single block in a + noninterleaved scan. +We do not use the terms "pixel" and "sample" interchangeably. When we say +pixel, we mean an element of the full-size image, while a sample is an element +of the downsampled image. Thus the number of samples may vary across +components while the number of pixels does not. (This terminology is not used +rigorously throughout the code, but it is used in places where confusion would +otherwise result.) + + +*** System features *** + +The IJG distribution contains two parts: + * A subroutine library for JPEG compression and decompression. + * cjpeg/djpeg, two sample applications that use the library to transform + JFIF JPEG files to and from several other image formats. +cjpeg/djpeg are of no great intellectual complexity: they merely add a simple +command-line user interface and I/O routines for several uncompressed image +formats. This document concentrates on the library itself. + +We desire the library to be capable of supporting all JPEG baseline, extended +sequential, and progressive DCT processes. Hierarchical processes are not +supported. + +The library does not support the lossless (spatial) JPEG process. Lossless +JPEG shares little or no code with lossy JPEG, and would normally be used +without the extensive pre- and post-processing provided by this library. +We feel that lossless JPEG is better handled by a separate library. + +Within these limits, any set of compression parameters allowed by the JPEG +spec should be readable for decompression. (We can be more restrictive about +what formats we can generate.) Although the system design allows for all +parameter values, some uncommon settings are not yet implemented and may +never be; nonintegral sampling ratios are the prime example. Furthermore, +we treat 8-bit vs. 12-bit data precision as a compile-time switch, not a +run-time option, because most machines can store 8-bit pixels much more +compactly than 12-bit. + +By itself, the library handles only interchange JPEG datastreams --- in +particular the widely used JFIF file format. The library can be used by +surrounding code to process interchange or abbreviated JPEG datastreams that +are embedded in more complex file formats. (For example, libtiff uses this +library to implement JPEG compression within the TIFF file format.) + +The library includes a substantial amount of code that is not covered by the +JPEG standard but is necessary for typical applications of JPEG. These +functions preprocess the image before JPEG compression or postprocess it after +decompression. They include colorspace conversion, downsampling/upsampling, +and color quantization. This code can be omitted if not needed. + +A wide range of quality vs. speed tradeoffs are possible in JPEG processing, +and even more so in decompression postprocessing. The decompression library +provides multiple implementations that cover most of the useful tradeoffs, +ranging from very-high-quality down to fast-preview operation. On the +compression side we have generally not provided low-quality choices, since +compression is normally less time-critical. It should be understood that the +low-quality modes may not meet the JPEG standard's accuracy requirements; +nonetheless, they are useful for viewers. + + +*** Portability issues *** + +Portability is an essential requirement for the library. The key portability +issues that show up at the level of system architecture are: + +1. Memory usage. We want the code to be able to run on PC-class machines +with limited memory. Images should therefore be processed sequentially (in +strips), to avoid holding the whole image in memory at once. Where a +full-image buffer is necessary, we should be able to use either virtual memory +or temporary files. + +2. Near/far pointer distinction. To run efficiently on 80x86 machines, the +code should distinguish "small" objects (kept in near data space) from +"large" ones (kept in far data space). This is an annoying restriction, but +fortunately it does not impact code quality for less brain-damaged machines, +and the source code clutter turns out to be minimal with sufficient use of +pointer typedefs. + +3. Data precision. We assume that "char" is at least 8 bits, "short" and +"int" at least 16, "long" at least 32. The code will work fine with larger +data sizes, although memory may be used inefficiently in some cases. However, +the JPEG compressed datastream must ultimately appear on external storage as a +sequence of 8-bit bytes if it is to conform to the standard. This may pose a +problem on machines where char is wider than 8 bits. The library represents +compressed data as an array of values of typedef JOCTET. If no data type +exactly 8 bits wide is available, custom data source and data destination +modules must be written to unpack and pack the chosen JOCTET datatype into +8-bit external representation. + + +*** System overview *** + +The compressor and decompressor are each divided into two main sections: +the JPEG compressor or decompressor proper, and the preprocessing or +postprocessing functions. The interface between these two sections is the +image data that the official JPEG spec regards as its input or output: this +data is in the colorspace to be used for compression, and it is downsampled +to the sampling factors to be used. The preprocessing and postprocessing +steps are responsible for converting a normal image representation to or from +this form. (Those few applications that want to deal with YCbCr downsampled +data can skip the preprocessing or postprocessing step.) + +Looking more closely, the compressor library contains the following main +elements: + + Preprocessing: + * Color space conversion (e.g., RGB to YCbCr). + * Edge expansion and downsampling. Optionally, this step can do simple + smoothing --- this is often helpful for low-quality source data. + JPEG proper: + * MCU assembly, DCT, quantization. + * Entropy coding (sequential or progressive, Huffman or arithmetic). + +In addition to these modules we need overall control, marker generation, +and support code (memory management & error handling). There is also a +module responsible for physically writing the output data --- typically +this is just an interface to fwrite(), but some applications may need to +do something else with the data. + +The decompressor library contains the following main elements: + + JPEG proper: + * Entropy decoding (sequential or progressive, Huffman or arithmetic). + * Dequantization, inverse DCT, MCU disassembly. + Postprocessing: + * Upsampling. Optionally, this step may be able to do more general + rescaling of the image. + * Color space conversion (e.g., YCbCr to RGB). This step may also + provide gamma adjustment [ currently it does not ]. + * Optional color quantization (e.g., reduction to 256 colors). + * Optional color precision reduction (e.g., 24-bit to 15-bit color). + [This feature is not currently implemented.] + +We also need overall control, marker parsing, and a data source module. +The support code (memory management & error handling) can be shared with +the compression half of the library. + +There may be several implementations of each of these elements, particularly +in the decompressor, where a wide range of speed/quality tradeoffs is very +useful. It must be understood that some of the best speedups involve +merging adjacent steps in the pipeline. For example, upsampling, color space +conversion, and color quantization might all be done at once when using a +low-quality ordered-dither technique. The system architecture is designed to +allow such merging where appropriate. + + +Note: it is convenient to regard edge expansion (padding to block boundaries) +as a preprocessing/postprocessing function, even though the JPEG spec includes +it in compression/decompression. We do this because downsampling/upsampling +can be simplified a little if they work on padded data: it's not necessary to +have special cases at the right and bottom edges. Therefore the interface +buffer is always an integral number of blocks wide and high, and we expect +compression preprocessing to pad the source data properly. Padding will occur +only to the next block (8-sample) boundary. In an interleaved-scan situation, +additional dummy blocks may be used to fill out MCUs, but the MCU assembly and +disassembly logic will create or discard these blocks internally. (This is +advantageous for speed reasons, since we avoid DCTing the dummy blocks. +It also permits a small reduction in file size, because the compressor can +choose dummy block contents so as to minimize their size in compressed form. +Finally, it makes the interface buffer specification independent of whether +the file is actually interleaved or not.) Applications that wish to deal +directly with the downsampled data must provide similar buffering and padding +for odd-sized images. + + +*** Poor man's object-oriented programming *** + +It should be clear by now that we have a lot of quasi-independent processing +steps, many of which have several possible behaviors. To avoid cluttering the +code with lots of switch statements, we use a simple form of object-style +programming to separate out the different possibilities. + +For example, two different color quantization algorithms could be implemented +as two separate modules that present the same external interface; at runtime, +the calling code will access the proper module indirectly through an "object". + +We can get the limited features we need while staying within portable C. +The basic tool is a function pointer. An "object" is just a struct +containing one or more function pointer fields, each of which corresponds to +a method name in real object-oriented languages. During initialization we +fill in the function pointers with references to whichever module we have +determined we need to use in this run. Then invocation of the module is done +by indirecting through a function pointer; on most machines this is no more +expensive than a switch statement, which would be the only other way of +making the required run-time choice. The really significant benefit, of +course, is keeping the source code clean and well structured. + +We can also arrange to have private storage that varies between different +implementations of the same kind of object. We do this by making all the +module-specific object structs be separately allocated entities, which will +be accessed via pointers in the master compression or decompression struct. +The "public" fields or methods for a given kind of object are specified by +a commonly known struct. But a module's initialization code can allocate +a larger struct that contains the common struct as its first member, plus +additional private fields. With appropriate pointer casting, the module's +internal functions can access these private fields. (For a simple example, +see jdatadst.c, which implements the external interface specified by struct +jpeg_destination_mgr, but adds extra fields.) + +(Of course this would all be a lot easier if we were using C++, but we are +not yet prepared to assume that everyone has a C++ compiler.) + +An important benefit of this scheme is that it is easy to provide multiple +versions of any method, each tuned to a particular case. While a lot of +precalculation might be done to select an optimal implementation of a method, +the cost per invocation is constant. For example, the upsampling step might +have a "generic" method, plus one or more "hardwired" methods for the most +popular sampling factors; the hardwired methods would be faster because they'd +use straight-line code instead of for-loops. The cost to determine which +method to use is paid only once, at startup, and the selection criteria are +hidden from the callers of the method. + +This plan differs a little bit from usual object-oriented structures, in that +only one instance of each object class will exist during execution. The +reason for having the class structure is that on different runs we may create +different instances (choose to execute different modules). You can think of +the term "method" as denoting the common interface presented by a particular +set of interchangeable functions, and "object" as denoting a group of related +methods, or the total shared interface behavior of a group of modules. + + +*** Overall control structure *** + +We previously mentioned the need for overall control logic in the compression +and decompression libraries. In IJG implementations prior to v5, overall +control was mostly provided by "pipeline control" modules, which proved to be +large, unwieldy, and hard to understand. To improve the situation, the +control logic has been subdivided into multiple modules. The control modules +consist of: + +1. Master control for module selection and initialization. This has two +responsibilities: + + 1A. Startup initialization at the beginning of image processing. + The individual processing modules to be used in this run are selected + and given initialization calls. + + 1B. Per-pass control. This determines how many passes will be performed + and calls each active processing module to configure itself + appropriately at the beginning of each pass. End-of-pass processing, + where necessary, is also invoked from the master control module. + + Method selection is partially distributed, in that a particular processing + module may contain several possible implementations of a particular method, + which it will select among when given its initialization call. The master + control code need only be concerned with decisions that affect more than + one module. + +2. Data buffering control. A separate control module exists for each + inter-processing-step data buffer. This module is responsible for + invoking the processing steps that write or read that data buffer. + +Each buffer controller sees the world as follows: + +input data => processing step A => buffer => processing step B => output data + | | | + ------------------ controller ------------------ + +The controller knows the dataflow requirements of steps A and B: how much data +they want to accept in one chunk and how much they output in one chunk. Its +function is to manage its buffer and call A and B at the proper times. + +A data buffer control module may itself be viewed as a processing step by a +higher-level control module; thus the control modules form a binary tree with +elementary processing steps at the leaves of the tree. + +The control modules are objects. A considerable amount of flexibility can +be had by replacing implementations of a control module. For example: +* Merging of adjacent steps in the pipeline is done by replacing a control + module and its pair of processing-step modules with a single processing- + step module. (Hence the possible merges are determined by the tree of + control modules.) +* In some processing modes, a given interstep buffer need only be a "strip" + buffer large enough to accommodate the desired data chunk sizes. In other + modes, a full-image buffer is needed and several passes are required. + The control module determines which kind of buffer is used and manipulates + virtual array buffers as needed. One or both processing steps may be + unaware of the multi-pass behavior. + +In theory, we might be able to make all of the data buffer controllers +interchangeable and provide just one set of implementations for all. In +practice, each one contains considerable special-case processing for its +particular job. The buffer controller concept should be regarded as an +overall system structuring principle, not as a complete description of the +task performed by any one controller. + + +*** Compression object structure *** + +Here is a sketch of the logical structure of the JPEG compression library: + + |-- Colorspace conversion + |-- Preprocessing controller --| + | |-- Downsampling +Main controller --| + | |-- Forward DCT, quantize + |-- Coefficient controller --| + |-- Entropy encoding + +This sketch also describes the flow of control (subroutine calls) during +typical image data processing. Each of the components shown in the diagram is +an "object" which may have several different implementations available. One +or more source code files contain the actual implementation(s) of each object. + +The objects shown above are: + +* Main controller: buffer controller for the subsampled-data buffer, which + holds the preprocessed input data. This controller invokes preprocessing to + fill the subsampled-data buffer, and JPEG compression to empty it. There is + usually no need for a full-image buffer here; a strip buffer is adequate. + +* Preprocessing controller: buffer controller for the downsampling input data + buffer, which lies between colorspace conversion and downsampling. Note + that a unified conversion/downsampling module would probably replace this + controller entirely. + +* Colorspace conversion: converts application image data into the desired + JPEG color space; also changes the data from pixel-interleaved layout to + separate component planes. Processes one pixel row at a time. + +* Downsampling: performs reduction of chroma components as required. + Optionally may perform pixel-level smoothing as well. Processes a "row + group" at a time, where a row group is defined as Vmax pixel rows of each + component before downsampling, and Vk sample rows afterwards (remember Vk + differs across components). Some downsampling or smoothing algorithms may + require context rows above and below the current row group; the + preprocessing controller is responsible for supplying these rows via proper + buffering. The downsampler is responsible for edge expansion at the right + edge (i.e., extending each sample row to a multiple of 8 samples); but the + preprocessing controller is responsible for vertical edge expansion (i.e., + duplicating the bottom sample row as needed to make a multiple of 8 rows). + +* Coefficient controller: buffer controller for the DCT-coefficient data. + This controller handles MCU assembly, including insertion of dummy DCT + blocks when needed at the right or bottom edge. When performing + Huffman-code optimization or emitting a multiscan JPEG file, this + controller is responsible for buffering the full image. The equivalent of + one fully interleaved MCU row of subsampled data is processed per call, + even when the JPEG file is noninterleaved. + +* Forward DCT and quantization: Perform DCT, quantize, and emit coefficients. + Works on one or more DCT blocks at a time. (Note: the coefficients are now + emitted in normal array order, which the entropy encoder is expected to + convert to zigzag order as necessary. Prior versions of the IJG code did + the conversion to zigzag order within the quantization step.) + +* Entropy encoding: Perform Huffman or arithmetic entropy coding and emit the + coded data to the data destination module. Works on one MCU per call. + For progressive JPEG, the same DCT blocks are fed to the entropy coder + during each pass, and the coder must emit the appropriate subset of + coefficients. + +In addition to the above objects, the compression library includes these +objects: + +* Master control: determines the number of passes required, controls overall + and per-pass initialization of the other modules. + +* Marker writing: generates JPEG markers (except for RSTn, which is emitted + by the entropy encoder when needed). + +* Data destination manager: writes the output JPEG datastream to its final + destination (e.g., a file). The destination manager supplied with the + library knows how to write to a stdio stream; for other behaviors, the + surrounding application may provide its own destination manager. + +* Memory manager: allocates and releases memory, controls virtual arrays + (with backing store management, where required). + +* Error handler: performs formatting and output of error and trace messages; + determines handling of nonfatal errors. The surrounding application may + override some or all of this object's methods to change error handling. + +* Progress monitor: supports output of "percent-done" progress reports. + This object represents an optional callback to the surrounding application: + if wanted, it must be supplied by the application. + +The error handler, destination manager, and progress monitor objects are +defined as separate objects in order to simplify application-specific +customization of the JPEG library. A surrounding application may override +individual methods or supply its own all-new implementation of one of these +objects. The object interfaces for these objects are therefore treated as +part of the application interface of the library, whereas the other objects +are internal to the library. + +The error handler and memory manager are shared by JPEG compression and +decompression; the progress monitor, if used, may be shared as well. + + +*** Decompression object structure *** + +Here is a sketch of the logical structure of the JPEG decompression library: + + |-- Entropy decoding + |-- Coefficient controller --| + | |-- Dequantize, Inverse DCT +Main controller --| + | |-- Upsampling + |-- Postprocessing controller --| |-- Colorspace conversion + |-- Color quantization + |-- Color precision reduction + +As before, this diagram also represents typical control flow. The objects +shown are: + +* Main controller: buffer controller for the subsampled-data buffer, which + holds the output of JPEG decompression proper. This controller's primary + task is to feed the postprocessing procedure. Some upsampling algorithms + may require context rows above and below the current row group; when this + is true, the main controller is responsible for managing its buffer so as + to make context rows available. In the current design, the main buffer is + always a strip buffer; a full-image buffer is never required. + +* Coefficient controller: buffer controller for the DCT-coefficient data. + This controller handles MCU disassembly, including deletion of any dummy + DCT blocks at the right or bottom edge. When reading a multiscan JPEG + file, this controller is responsible for buffering the full image. + (Buffering DCT coefficients, rather than samples, is necessary to support + progressive JPEG.) The equivalent of one fully interleaved MCU row of + subsampled data is processed per call, even when the source JPEG file is + noninterleaved. + +* Entropy decoding: Read coded data from the data source module and perform + Huffman or arithmetic entropy decoding. Works on one MCU per call. + For progressive JPEG decoding, the coefficient controller supplies the prior + coefficients of each MCU (initially all zeroes), which the entropy decoder + modifies in each scan. + +* Dequantization and inverse DCT: like it says. Note that the coefficients + buffered by the coefficient controller have NOT been dequantized; we + merge dequantization and inverse DCT into a single step for speed reasons. + When scaled-down output is asked for, simplified DCT algorithms may be used + that need fewer coefficients and emit fewer samples per DCT block, not the + full 8x8. Works on one DCT block at a time. + +* Postprocessing controller: buffer controller for the color quantization + input buffer, when quantization is in use. (Without quantization, this + controller just calls the upsampler.) For two-pass quantization, this + controller is responsible for buffering the full-image data. + +* Upsampling: restores chroma components to full size. (May support more + general output rescaling, too. Note that if undersized DCT outputs have + been emitted by the DCT module, this module must adjust so that properly + sized outputs are created.) Works on one row group at a time. This module + also calls the color conversion module, so its top level is effectively a + buffer controller for the upsampling->color conversion buffer. However, in + all but the highest-quality operating modes, upsampling and color + conversion are likely to be merged into a single step. + +* Colorspace conversion: convert from JPEG color space to output color space, + and change data layout from separate component planes to pixel-interleaved. + Works on one pixel row at a time. + +* Color quantization: reduce the data to colormapped form, using either an + externally specified colormap or an internally generated one. This module + is not used for full-color output. Works on one pixel row at a time; may + require two passes to generate a color map. Note that the output will + always be a single component representing colormap indexes. In the current + design, the output values are JSAMPLEs, so an 8-bit compilation cannot + quantize to more than 256 colors. This is unlikely to be a problem in + practice. + +* Color reduction: this module handles color precision reduction, e.g., + generating 15-bit color (5 bits/primary) from JPEG's 24-bit output. + Not quite clear yet how this should be handled... should we merge it with + colorspace conversion??? + +Note that some high-speed operating modes might condense the entire +postprocessing sequence to a single module (upsample, color convert, and +quantize in one step). + +In addition to the above objects, the decompression library includes these +objects: + +* Master control: determines the number of passes required, controls overall + and per-pass initialization of the other modules. This is subdivided into + input and output control: jdinput.c controls only input-side processing, + while jdmaster.c handles overall initialization and output-side control. + +* Marker reading: decodes JPEG markers (except for RSTn). + +* Data source manager: supplies the input JPEG datastream. The source + manager supplied with the library knows how to read from a stdio stream; + for other behaviors, the surrounding application may provide its own source + manager. + +* Memory manager: same as for compression library. + +* Error handler: same as for compression library. + +* Progress monitor: same as for compression library. + +As with compression, the data source manager, error handler, and progress +monitor are candidates for replacement by a surrounding application. + + +*** Decompression input and output separation *** + +To support efficient incremental display of progressive JPEG files, the +decompressor is divided into two sections that can run independently: + +1. Data input includes marker parsing, entropy decoding, and input into the + coefficient controller's DCT coefficient buffer. Note that this + processing is relatively cheap and fast. + +2. Data output reads from the DCT coefficient buffer and performs the IDCT + and all postprocessing steps. + +For a progressive JPEG file, the data input processing is allowed to get +arbitrarily far ahead of the data output processing. (This occurs only +if the application calls jpeg_consume_input(); otherwise input and output +run in lockstep, since the input section is called only when the output +section needs more data.) In this way the application can avoid making +extra display passes when data is arriving faster than the display pass +can run. Furthermore, it is possible to abort an output pass without +losing anything, since the coefficient buffer is read-only as far as the +output section is concerned. See libjpeg.txt for more detail. + +A full-image coefficient array is only created if the JPEG file has multiple +scans (or if the application specifies buffered-image mode anyway). When +reading a single-scan file, the coefficient controller normally creates only +a one-MCU buffer, so input and output processing must run in lockstep in this +case. jpeg_consume_input() is effectively a no-op in this situation. + +The main impact of dividing the decompressor in this fashion is that we must +be very careful with shared variables in the cinfo data structure. Each +variable that can change during the course of decompression must be +classified as belonging to data input or data output, and each section must +look only at its own variables. For example, the data output section may not +depend on any of the variables that describe the current scan in the JPEG +file, because these may change as the data input section advances into a new +scan. + +The progress monitor is (somewhat arbitrarily) defined to treat input of the +file as one pass when buffered-image mode is not used, and to ignore data +input work completely when buffered-image mode is used. Note that the +library has no reliable way to predict the number of passes when dealing +with a progressive JPEG file, nor can it predict the number of output passes +in buffered-image mode. So the work estimate is inherently bogus anyway. + +No comparable division is currently made in the compression library, because +there isn't any real need for it. + + +*** Data formats *** + +Arrays of pixel sample values use the following data structure: + + typedef something JSAMPLE; a pixel component value, 0..MAXJSAMPLE + typedef JSAMPLE *JSAMPROW; ptr to a row of samples + typedef JSAMPROW *JSAMPARRAY; ptr to a list of rows + typedef JSAMPARRAY *JSAMPIMAGE; ptr to a list of color-component arrays + +The basic element type JSAMPLE will typically be one of unsigned char, +(signed) char, or short. Short will be used if samples wider than 8 bits are +to be supported (this is a compile-time option). Otherwise, unsigned char is +used if possible. If the compiler only supports signed chars, then it is +necessary to mask off the value when reading. Thus, all reads of JSAMPLE +values must be coded as "GETJSAMPLE(value)", where the macro will be defined +as "((value) & 0xFF)" on signed-char machines and "((int) (value))" elsewhere. + +With these conventions, JSAMPLE values can be assumed to be >= 0. This helps +simplify correct rounding during downsampling, etc. The JPEG standard's +specification that sample values run from -128..127 is accommodated by +subtracting 128 from the sample value in the DCT step. Similarly, during +decompression the output of the IDCT step will be immediately shifted back to +0..255. (NB: different values are required when 12-bit samples are in use. +The code is written in terms of MAXJSAMPLE and CENTERJSAMPLE, which will be +defined as 255 and 128 respectively in an 8-bit implementation, and as 4095 +and 2048 in a 12-bit implementation.) + +We use a pointer per row, rather than a two-dimensional JSAMPLE array. This +choice costs only a small amount of memory and has several benefits: +* Code using the data structure doesn't need to know the allocated width of + the rows. This simplifies edge expansion/compression, since we can work + in an array that's wider than the logical picture width. +* Indexing doesn't require multiplication; this is a performance win on many + machines. +* Arrays with more than 64K total elements can be supported even on machines + where malloc() cannot allocate chunks larger than 64K. +* The rows forming a component array may be allocated at different times + without extra copying. This trick allows some speedups in smoothing steps + that need access to the previous and next rows. + +Note that each color component is stored in a separate array; we don't use the +traditional layout in which the components of a pixel are stored together. +This simplifies coding of modules that work on each component independently, +because they don't need to know how many components there are. Furthermore, +we can read or write each component to a temporary file independently, which +is helpful when dealing with noninterleaved JPEG files. + +In general, a specific sample value is accessed by code such as + GETJSAMPLE(image[colorcomponent][row][col]) +where col is measured from the image left edge, but row is measured from the +first sample row currently in memory. Either of the first two indexings can +be precomputed by copying the relevant pointer. + + +Since most image-processing applications prefer to work on images in which +the components of a pixel are stored together, the data passed to or from the +surrounding application uses the traditional convention: a single pixel is +represented by N consecutive JSAMPLE values, and an image row is an array of +(# of color components)*(image width) JSAMPLEs. One or more rows of data can +be represented by a pointer of type JSAMPARRAY in this scheme. This scheme is +converted to component-wise storage inside the JPEG library. (Applications +that want to skip JPEG preprocessing or postprocessing will have to contend +with component-wise storage.) + + +Arrays of DCT-coefficient values use the following data structure: + + typedef short JCOEF; a 16-bit signed integer + typedef JCOEF JBLOCK[DCTSIZE2]; an 8x8 block of coefficients + typedef JBLOCK *JBLOCKROW; ptr to one horizontal row of 8x8 blocks + typedef JBLOCKROW *JBLOCKARRAY; ptr to a list of such rows + typedef JBLOCKARRAY *JBLOCKIMAGE; ptr to a list of color component arrays + +The underlying type is at least a 16-bit signed integer; while "short" is big +enough on all machines of interest, on some machines it is preferable to use +"int" for speed reasons, despite the storage cost. Coefficients are grouped +into 8x8 blocks (but we always use #defines DCTSIZE and DCTSIZE2 rather than +"8" and "64"). + +The contents of a coefficient block may be in either "natural" or zigzagged +order, and may be true values or divided by the quantization coefficients, +depending on where the block is in the processing pipeline. In the current +library, coefficient blocks are kept in natural order everywhere; the entropy +codecs zigzag or dezigzag the data as it is written or read. The blocks +contain quantized coefficients everywhere outside the DCT/IDCT subsystems. +(This latter decision may need to be revisited to support variable +quantization a la JPEG Part 3.) + +Notice that the allocation unit is now a row of 8x8 blocks, corresponding to +eight rows of samples. Otherwise the structure is much the same as for +samples, and for the same reasons. + +On machines where malloc() can't handle a request bigger than 64Kb, this data +structure limits us to rows of less than 512 JBLOCKs, or a picture width of +4000+ pixels. This seems an acceptable restriction. + + +On 80x86 machines, the bottom-level pointer types (JSAMPROW and JBLOCKROW) +must be declared as "far" pointers, but the upper levels can be "near" +(implying that the pointer lists are allocated in the DS segment). +We use a #define symbol FAR, which expands to the "far" keyword when +compiling on 80x86 machines and to nothing elsewhere. + + +*** Suspendable processing *** + +In some applications it is desirable to use the JPEG library as an +incremental, memory-to-memory filter. In this situation the data source or +destination may be a limited-size buffer, and we can't rely on being able to +empty or refill the buffer at arbitrary times. Instead the application would +like to have control return from the library at buffer overflow/underrun, and +then resume compression or decompression at a later time. + +This scenario is supported for simple cases. (For anything more complex, we +recommend that the application "bite the bullet" and develop real multitasking +capability.) The libjpeg.txt file goes into more detail about the usage and +limitations of this capability; here we address the implications for library +structure. + +The essence of the problem is that the entropy codec (coder or decoder) must +be prepared to stop at arbitrary times. In turn, the controllers that call +the entropy codec must be able to stop before having produced or consumed all +the data that they normally would handle in one call. That part is reasonably +straightforward: we make the controller call interfaces include "progress +counters" which indicate the number of data chunks successfully processed, and +we require callers to test the counter rather than just assume all of the data +was processed. + +Rather than trying to restart at an arbitrary point, the current Huffman +codecs are designed to restart at the beginning of the current MCU after a +suspension due to buffer overflow/underrun. At the start of each call, the +codec's internal state is loaded from permanent storage (in the JPEG object +structures) into local variables. On successful completion of the MCU, the +permanent state is updated. (This copying is not very expensive, and may even +lead to *improved* performance if the local variables can be registerized.) +If a suspension occurs, the codec simply returns without updating the state, +thus effectively reverting to the start of the MCU. Note that this implies +leaving some data unprocessed in the source/destination buffer (ie, the +compressed partial MCU). The data source/destination module interfaces are +specified so as to make this possible. This also implies that the data buffer +must be large enough to hold a worst-case compressed MCU; a couple thousand +bytes should be enough. + +In a successive-approximation AC refinement scan, the progressive Huffman +decoder has to be able to undo assignments of newly nonzero coefficients if it +suspends before the MCU is complete, since decoding requires distinguishing +previously-zero and previously-nonzero coefficients. This is a bit tedious +but probably won't have much effect on performance. Other variants of Huffman +decoding need not worry about this, since they will just store the same values +again if forced to repeat the MCU. + +This approach would probably not work for an arithmetic codec, since its +modifiable state is quite large and couldn't be copied cheaply. Instead it +would have to suspend and resume exactly at the point of the buffer end. + +The JPEG marker reader is designed to cope with suspension at an arbitrary +point. It does so by backing up to the start of the marker parameter segment, +so the data buffer must be big enough to hold the largest marker of interest. +Again, a couple KB should be adequate. (A special "skip" convention is used +to bypass COM and APPn markers, so these can be larger than the buffer size +without causing problems; otherwise a 64K buffer would be needed in the worst +case.) + +The JPEG marker writer currently does *not* cope with suspension. +We feel that this is not necessary; it is much easier simply to require +the application to ensure there is enough buffer space before starting. (An +empty 2K buffer is more than sufficient for the header markers; and ensuring +there are a dozen or two bytes available before calling jpeg_finish_compress() +will suffice for the trailer.) This would not work for writing multi-scan +JPEG files, but we simply do not intend to support that capability with +suspension. + + +*** Memory manager services *** + +The JPEG library's memory manager controls allocation and deallocation of +memory, and it manages large "virtual" data arrays on machines where the +operating system does not provide virtual memory. Note that the same +memory manager serves both compression and decompression operations. + +In all cases, allocated objects are tied to a particular compression or +decompression master record, and they will be released when that master +record is destroyed. + +The memory manager does not provide explicit deallocation of objects. +Instead, objects are created in "pools" of free storage, and a whole pool +can be freed at once. This approach helps prevent storage-leak bugs, and +it speeds up operations whenever malloc/free are slow (as they often are). +The pools can be regarded as lifetime identifiers for objects. Two +pools/lifetimes are defined: + * JPOOL_PERMANENT lasts until master record is destroyed + * JPOOL_IMAGE lasts until done with image (JPEG datastream) +Permanent lifetime is used for parameters and tables that should be carried +across from one datastream to another; this includes all application-visible +parameters. Image lifetime is used for everything else. (A third lifetime, +JPOOL_PASS = one processing pass, was originally planned. However it was +dropped as not being worthwhile. The actual usage patterns are such that the +peak memory usage would be about the same anyway; and having per-pass storage +substantially complicates the virtual memory allocation rules --- see below.) + +The memory manager deals with three kinds of object: +1. "Small" objects. Typically these require no more than 10K-20K total. +2. "Large" objects. These may require tens to hundreds of K depending on + image size. Semantically they behave the same as small objects, but we + distinguish them for two reasons: + * On MS-DOS machines, large objects are referenced by FAR pointers, + small objects by NEAR pointers. + * Pool allocation heuristics may differ for large and small objects. + Note that individual "large" objects cannot exceed the size allowed by + type size_t, which may be 64K or less on some machines. +3. "Virtual" objects. These are large 2-D arrays of JSAMPLEs or JBLOCKs + (typically large enough for the entire image being processed). The + memory manager provides stripwise access to these arrays. On machines + without virtual memory, the rest of the array may be swapped out to a + temporary file. + +(Note: JSAMPARRAY and JBLOCKARRAY data structures are a combination of large +objects for the data proper and small objects for the row pointers. For +convenience and speed, the memory manager provides single routines to create +these structures. Similarly, virtual arrays include a small control block +and a JSAMPARRAY or JBLOCKARRAY working buffer, all created with one call.) + +In the present implementation, virtual arrays are only permitted to have image +lifespan. (Permanent lifespan would not be reasonable, and pass lifespan is +not very useful since a virtual array's raison d'etre is to store data for +multiple passes through the image.) We also expect that only "small" objects +will be given permanent lifespan, though this restriction is not required by +the memory manager. + +In a non-virtual-memory machine, some performance benefit can be gained by +making the in-memory buffers for virtual arrays be as large as possible. +(For small images, the buffers might fit entirely in memory, so blind +swapping would be very wasteful.) The memory manager will adjust the height +of the buffers to fit within a prespecified maximum memory usage. In order +to do this in a reasonably optimal fashion, the manager needs to allocate all +of the virtual arrays at once. Therefore, there isn't a one-step allocation +routine for virtual arrays; instead, there is a "request" routine that simply +allocates the control block, and a "realize" routine (called just once) that +determines space allocation and creates all of the actual buffers. The +realize routine must allow for space occupied by non-virtual large objects. +(We don't bother to factor in the space needed for small objects, on the +grounds that it isn't worth the trouble.) + +To support all this, we establish the following protocol for doing business +with the memory manager: + 1. Modules must request virtual arrays (which may have only image lifespan) + during the initial setup phase, i.e., in their jinit_xxx routines. + 2. All "large" objects (including JSAMPARRAYs and JBLOCKARRAYs) must also be + allocated during initial setup. + 3. realize_virt_arrays will be called at the completion of initial setup. + The above conventions ensure that sufficient information is available + for it to choose a good size for virtual array buffers. +Small objects of any lifespan may be allocated at any time. We expect that +the total space used for small objects will be small enough to be negligible +in the realize_virt_arrays computation. + +In a virtual-memory machine, we simply pretend that the available space is +infinite, thus causing realize_virt_arrays to decide that it can allocate all +the virtual arrays as full-size in-memory buffers. The overhead of the +virtual-array access protocol is very small when no swapping occurs. + +A virtual array can be specified to be "pre-zeroed"; when this flag is set, +never-yet-written sections of the array are set to zero before being made +available to the caller. If this flag is not set, never-written sections +of the array contain garbage. (This feature exists primarily because the +equivalent logic would otherwise be needed in jdcoefct.c for progressive +JPEG mode; we may as well make it available for possible other uses.) + +The first write pass on a virtual array is required to occur in top-to-bottom +order; read passes, as well as any write passes after the first one, may +access the array in any order. This restriction exists partly to simplify +the virtual array control logic, and partly because some file systems may not +support seeking beyond the current end-of-file in a temporary file. The main +implication of this restriction is that rearrangement of rows (such as +converting top-to-bottom data order to bottom-to-top) must be handled while +reading data out of the virtual array, not while putting it in. + + +*** Memory manager internal structure *** + +To isolate system dependencies as much as possible, we have broken the +memory manager into two parts. There is a reasonably system-independent +"front end" (jmemmgr.c) and a "back end" that contains only the code +likely to change across systems. All of the memory management methods +outlined above are implemented by the front end. The back end provides +the following routines for use by the front end (none of these routines +are known to the rest of the JPEG code): + +jpeg_mem_init, jpeg_mem_term system-dependent initialization/shutdown + +jpeg_get_small, jpeg_free_small interface to malloc and free library routines + (or their equivalents) + +jpeg_get_large, jpeg_free_large interface to FAR malloc/free in MSDOS machines; + else usually the same as + jpeg_get_small/jpeg_free_small + +jpeg_mem_available estimate available memory + +jpeg_open_backing_store create a backing-store object + +read_backing_store, manipulate a backing-store object +write_backing_store, +close_backing_store + +On some systems there will be more than one type of backing-store object +(specifically, in MS-DOS a backing store file might be an area of extended +memory as well as a disk file). jpeg_open_backing_store is responsible for +choosing how to implement a given object. The read/write/close routines +are method pointers in the structure that describes a given object; this +lets them be different for different object types. + +It may be necessary to ensure that backing store objects are explicitly +released upon abnormal program termination. For example, MS-DOS won't free +extended memory by itself. To support this, we will expect the main program +or surrounding application to arrange to call self_destruct (typically via +jpeg_destroy) upon abnormal termination. This may require a SIGINT signal +handler or equivalent. We don't want to have the back end module install its +own signal handler, because that would pre-empt the surrounding application's +ability to control signal handling. + +The IJG distribution includes several memory manager back end implementations. +Usually the same back end should be suitable for all applications on a given +system, but it is possible for an application to supply its own back end at +need. + + +*** Implications of DNL marker *** + +Some JPEG files may use a DNL marker to postpone definition of the image +height (this would be useful for a fax-like scanner's output, for instance). +In these files the SOF marker claims the image height is 0, and you only +find out the true image height at the end of the first scan. + +We could read these files as follows: +1. Upon seeing zero image height, replace it by 65535 (the maximum allowed). +2. When the DNL is found, update the image height in the global image + descriptor. +This implies that control modules must avoid making copies of the image +height, and must re-test for termination after each MCU row. This would +be easy enough to do. + +In cases where image-size data structures are allocated, this approach will +result in very inefficient use of virtual memory or much-larger-than-necessary +temporary files. This seems acceptable for something that probably won't be a +mainstream usage. People might have to forgo use of memory-hogging options +(such as two-pass color quantization or noninterleaved JPEG files) if they +want efficient conversion of such files. (One could improve efficiency by +demanding a user-supplied upper bound for the height, less than 65536; in most +cases it could be much less.) + +The standard also permits the SOF marker to overestimate the image height, +with a DNL to give the true, smaller height at the end of the first scan. +This would solve the space problems if the overestimate wasn't too great. +However, it implies that you don't even know whether DNL will be used. + +This leads to a couple of very serious objections: +1. Testing for a DNL marker must occur in the inner loop of the decompressor's + Huffman decoder; this implies a speed penalty whether the feature is used + or not. +2. There is no way to hide the last-minute change in image height from an + application using the decoder. Thus *every* application using the IJG + library would suffer a complexity penalty whether it cared about DNL or + not. +We currently do not support DNL because of these problems. + +A different approach is to insist that DNL-using files be preprocessed by a +separate program that reads ahead to the DNL, then goes back and fixes the SOF +marker. This is a much simpler solution and is probably far more efficient. +Even if one wants piped input, buffering the first scan of the JPEG file needs +a lot smaller temp file than is implied by the maximum-height method. For +this approach we'd simply treat DNL as a no-op in the decompressor (at most, +check that it matches the SOF image height). + +We will not worry about making the compressor capable of outputting DNL. +Something similar to the first scheme above could be applied if anyone ever +wants to make that work. diff --git a/jpeg-8c/testimg.bmp b/jpeg-8c/testimg.bmp new file mode 100644 index 0000000000000000000000000000000000000000..012223eb67e30448ecb29b2c8ce501f98c0d464c GIT binary patch literal 35050 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 z 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.@.@.?-?-@-?-?-@,A.A-B,A*A)@*A*?/?/?/>,>,<+<+<+?+?+=*=*=*>+?+@,?:>7=4?1B3D3D3D4?/@2E8H;H9mB2T8*D3#:659549547326216005//50-72/72/72/61-61-50,50,50,.0-.0-.0-//-//-0/-2.-3--5,-4+,4*+4(*7(+=.1E69LUPdUPdUPd0/-0/-10.10.40-51.62/72.83/83/83/:3-:3-:3-:3-:3-91.91.80-80-80-80-91.91.80-80-80-80-80-80-80-80-6.+6.+5-*5-*5-*4,)4,)4,)5-*5-*5-*5-*5-*5-*5-*5-*/,%0-&0-&1.'2/(30)41*41*63,63,74-74-85.96/:70:70@:.A;/C=1E?3H@3IA4JB5JC3LC4LC4KB3MA1MA1NB2OC3PD4P>0U?1^A3jC4xD6D4D5B3B3@2@4B7C:EAKAICIDHDGBD@D>C;A9@9?.>.>,=+<+<+>->*>*=*=*>+?,@-@8>5>3?1A3D4D3C4A2B6E8I;G:kA3S9*D4$<66;55:4493382271161.61.72/72/72/61-61-50,50,50,.0-.0-.0-//-//-0/-2.-2.-3--5,-4*+4(*5)+<-0C47I:=h<;vDCJILJST`hk{r{|ylv[\QHsQBkOFaOFaNI_RN_[Yfnot~ojk[]\JVUCXQaXQaXQa/.,/.,0/-10.40-40-51.51.72.72.72.92,92,92,92,92,91.80-7/,7/,7/,7/,80-91.80-80-80-80-80-80-80-80-6.+5-*5-*5-*4,)4,)4,)4,)5-*5-*5-*5-*5-*5-*5-*5-*1.'1.'2/(30)30)41*41*52+63,63,63,74-85.96/96/:70?9-@:.B<0D>2G?4H@3H@3H@3I@1I@1I@1K?1K?/L@0MA1NB2MA1QA2YB2dC2qC3|C2A2@0<+:+;,>0@4C8F=G>?E@FBGCFDFCEAD?D;@:?:@=@@@A=@;>7@-@-@-?,?,?->,?,?-@-@,A+A,@*A*@)?/>.>.>.=+=+=+<+=,=,<+=)>*>*?+@,B7?5>3>2A4C5D5C4D6F9I=I=F;gA4P:,B6&=77=77<66:4493383072/72/62/62/62/52-52-41,41,41,,1-,1-.0-.0-//-//-0/-2.-5//4..5,-4*+4*+9-/>24C79_83l?:|E@IBNKZ^ftnw~zsdmUUNEtO?lMBbPEcQHcMH^NK\[[estx|xzlghXZ[KVTEZT`ZT`ZT`.-+/.,/.,0/-10.40-40-40-51.61-61-61-81+81+81+81+50-50-4/,4/,4/,4/,50-50-61.61.61.61.61.61.61.61.3.+3.+3.+2-*2-*2-*1,)1,)4/,4/,4/,4/,4/,4/,4/,4/,30+30+30+41,41,52-52-52-52-52-63.74/850850961961>8,?9-@:.B<0E=2E=2F>1F>1G=1G>/F=.I=/I=/J>0L@0L@0JD4NE4TD4^D3hE2sB1~A/>-9'9'9)<-@3E8I@CACCEDECDAC@C>A;@:?:>=@A?B=A7>5@,@,@,?->,>,?,>-?-?,@-@,@+@*@)@(>.>.>.=-=-=-<*<*=+=+<*<*=+=,>->-B6?5?2@2B4C6B5B5F:H>K@J@|F:aA4K;.?9+@86@86?75>64:5294183073062/62/62/32.32-21,21,21,-2.-2.-2./1./1.00.00.10.5106005//5,-4+,6,-:01>45W6-b<3qA7}D9H@RQ_iis|zu~my^gRQMDyM?rN@dPEgQFfLC^GBVNLZ^^fjnquzvx}vzvwzokoa`bUWYKTUG]V^]V^]V^.-+.-+.-+/.,0/-10.3/,40-3/,4/+4/+4/+4/+6/)6/)6/)4/,4/,3.+3.+3.+3.+4/,4/,50-50-50-50-50-50-50-50-3.+3.+2-*2-*2-*1,)1,)1,)4/,4/,4/,4/,4/,4/,4/,4/,41,41,41,41,41,52-52-52-52-52-63.63.74/850961961<5+=6,?8.@9/B:/C;0C;0C;.D:.D:.D:.G;-H<.I=/J>0K?1GH6KH7PG6XG5aF3jD1uB/|?,;):';(=,B2G7KDBDCDBEBC@@@>>:>:=9<;>?>B>C:A5?0@-?,?,?,>+>+>-?-?,?-?,?+?*?+?*>)?.?.>->->-=,=,=,=,=,=,=,<,=->.>.B4A4@1@3B5C7A8@7B;G?KCJ@uE;Y>3C9-78*@86@86?75>64=53:5294173062/43/43/32.23.12-12,12,,2.-2.-2.-2./1./1.00.00.3205105104..2,,4+,7./901P5*Y9,e>/n@1tB7|KGYcg~pxxs{js]eTTOGLAyPAjPAhMAeJA`GBYHEXKKWMPU^bc`fbcha`f\Z`TWZOUYKWYL`WZ`WZ`WZ,,,,,,---.-+/.,0/-10.3/,2.+2.+3.*3.*3.*3.*3.*3.*3.+3.+2-*1,)1,)2-*3.+3.+3.+3.+3.+3.+3.+3.+3.+3.+2-*2-*2-*2-*1,)1,)1,)0+(3.+3.+3.+3.+3.+3.+3.+3.+41,41,41,41,41,41,41,41,41,52-52-63.74/850850850;4*<5+=6,>7-@7.A8/A9.A9.C9/C9-C9-F:.G;/H<.J>0K?1FI8GH6MH5TG6[F3dC0lA.t?-{<*;);*=,A1F5J:M=E@FAFAE@C?@>==9<:<9;;=?=B=D8A2>,@,@,?+>->->,>,>.>-?,?,>,?+>*>)?)>->->->-=,=,=,<+=,<+<+<+<+=.>/?0C2A2@2A5B9C:@:@9@9H@NGNEoG=R@4?;039-A75A75@64>63<4194083/74/63.43.34/23.13.02-02-02--3/-3/-3/.3/.3/02/02/11/11/32032040/2.-1-,4..5//H4)M5)X8+a<,f>2nGBzYblu{|u|mubi[[SLLBQAnN?jI=cH>`HB^FCX@BO2K?3DG6EF6KE5PD4VC2^C2e@.m>,v=,|;):);*=.B2F7I:DG>F>E>C?@><>9:9:;<@.=->->,?.?-?,>,>*?*>)>->->-=,=,=,<-<-<-<-<,<,=-=0=0>1D2C1A3B6C:AkK5.>5.>5.>5,B8/B8/C9/E8/G:1I<3J=4K?3EC6FB6IC5NB4TA3\@2b>0h=-q<.w9*}8)7*:,=/B2D5E9F;GF@C?@@:9:9=;A;D:E4A-?(A-A-@.@.?.>-?->/>.@.?.?->+?*>)>+>->->-=,=.=-=-=-1?2D2C1B4B6C;C>C>D?PJ[Te\f]s_TYUJFNC>KA@70@72>71=6094.83-63,63.43.34.34.13.13..3-.3-.3--3/-3/-3/.3/.3/.3/.3/02/.0-00.22022000.0/-0/-10.8,,;,)B1*K7.S<4^IHtbnzʂyrwikXVGDI^C@[ABV>DP>EMGQSKWUQ^WU`XS_UR^TT^SV`UaZHaZHaZH,-/,-/------------.-+.-+/.,/.,1-*0,)0,)0,)/+(0+'/+*/+*/+*/+*/+*/+*/+*0,+/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*0,+0,+1-,1-,2.-1-,1-,1-,1-,1-,1-,1-,1-,0,)1-*2.+3/,3/,3/,3/,3/,3/,3/,3/,3/,40-51.62/73081+92,:3-;4.=4/>5.>5.>5.?4.?5,@6-C6.D7.F90G:1H;2F?5H@5J@6N@5R>3W<1\:0a7+k9.t8-|8+9,;/=0?1?2@3B5D8E:G=F>D?B>?=A?D?E>C8C1B.B,A.@-?,?,=-=->.?.<,=,=+>-=,=+=*>*<+<+<+<,<,<,;-;-=/F@C>DAKGXRf]qfth|rfik^S_SCSHQJBLE=D=5<8/95,74-63,33+43.34.23-13.02--2,,1+,1+-2.-2.-2.-2.-2.-2./1./1.02/02/11/11/11/11/11/11/5*2;/3A32C4/J;6]OOymyӐ݂tzjn_bYZPHmHBdA>]>>X?AVBHVLU^U`bbqnn}xv|pulyoguh_k_T`Ta[Eb\Fc]G,-/,-/,-/,-/---------.-+/.,.-+.-+0,)/+(/+(/+(/+(.*).*).*).*)/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*0,+0,+0,+1-,1-,1-,1-,1-,1-,1-,1-,1-,1-,0,)0,)1-*2.+3/,3/,2.+2.+2.+2.+2.+2.+3/,40-51.62/80-91.:2/;30=4/>50>50=4-?4.?4.?4.B5-C6.E80G:2H;3H>5J=5L=6O>6Q=4V;2Z90_7/h8.p7.y6-8-9.;1<1>1@3A5B5E8E:FF8C2B/C-B0A/@.?-?->->.>.=,=.=-=,=+>-=,>,=+=+<,<,<,;-;-<-4@6A7B8H7F7G:I@HBFAJFTMdZre~op~|mlteYgZJZOPLAKI=EC7@>2=:1:7.44*11)23+23-12,/1,/1,.0+.0+.0-/1./1./1./1./1./1./1./1.02/11/11/11/11/11/11/11/5*:9-9<15?53H?:^VTxszΐׄxpykten__yXZsSUjRWjU]j\gmguvrv}vypsfteXfW_YA`ZBb\D,-/,-/,-/,-/,-/---------.-+.-+.-+-,*/+(.*'.*'.*'.*+.*+.*+.*+-)*-)*-)*-)*/+,/+,/+,/+,/+,/+,/+,/+,.*+.*+/+,/+,/+,0,-0,-0,-0,-0,-0,-1-.1-.1-.1-.1-.0,+0,+1-,2.-2.-2.-2.-1-,1-,1-,1-,1-,2.-3/.40/51080-91.:2/;30=31=31=4/=4/?40?4.?4.A4.C60D7/F91G:2H;5J;6K<7N=6P;6S:5V72[60c60k6.t5,}7/9/:0<0<1@3@4@3A3C6C8D:CG@HBH?E:C3B0B.B/A.@->->->->-?0<-=-=,=.>-=,=+=+<*<,<,;+;+<-;,;-<0<0<2>3?4A8C:D;KJDIFKGSM_Vrgqz{wrocqbVdWPQCMN@HI;DD8@@4::055+/0(01)01+/0*/0+./*./*//-//-//-//-//-//-//-//-//-//-00.00.00.00.00.00.00.00.6*>6+;8.6;63HE>_^Yyz|Î˄}{||yq~o|n}oy|{j{iXiW\V<^X>`Z@-.0-.0-.0-.0-.0-.0......---.-+-,*-,*,+).*'.*'.*',*++)*+)*+)*+)**()*()*(),*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+-+,-+,-+,-+,.,-.,-.,-.,-/-./-./-./+*0,+1-,1-,1-,1-,0,+0,+0,+0,+0,+0,+1-,2.-3/.40/91/:20;31<42=31=31=31=31>3/>3/>3/@3-A4.C60D71E82G83H94I:5L:6M:6N94Q83T50^72e60o6/x8/90:/;1=1?4?4?2@1A2C5D7D:FIAH>F:C4B0B.A.A.?->,>,=.=.=.<,<.=.=-<.=-=-<,;);+;+;+;,;,;-:,;/<1<1>5@7C:EIICLGPL\Tj^oyzym{lam_UYHQUDKO@EI:@D6;=057,13(01)/0*/.).-).-).-+/.,0/-/.,/.,/.,/.,/.,/.,/.,/.,0/-0/-0/-0/-0/-0/-0/-0/-8*A6):3-1961HJ=bfX{y}~k|iUfSXT7ZV9^Z=+/2+/2-.0-.0-.0-.0-.0...------.-+-,*-,*,+),+),+),*+,*+,*++)*+)**()*()*(),*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*++)*+)*+)*,*+-+,-+,.,-.,-/-./-./-./+*0,+0,+0,+0,+0,+/+*.*)/+*/+*/+*/+*0,+1-,3/.40/91/:20;31<42=32=32<20<20=20=2.=2.?1.@2/A4.B5/C60D63C84D95G96G96H94K84N51V72_60h70r7/}:1<1=2>2?7?5?5?3A3C5D6E8E;F=G>F=D8B5@0@/A-A-?,>+<,<,=-=/<.<-=-<.<-<,<,<,;+:*:*:*:+:+:,:.;0<1=4?6B9D;G@HALAH?HAKGOLWQf]whw|}tqlte\eRV_LMVCEL0-?1.@2/A30A30?61@72@93A96A96B94E74G51O61W6/a6/j8/u9.0>7>5?5@4B4C4C4D4B5C8E:E;C7@4?1?2A,?-=,=,<+<+<.<.;-E5:@29<134,22*1.)/+(/*'0**3*+4+,1++1++1++1++1++1++1++0,+1-,1-,1-,1-,1-,1-,1-,/.,;(;5(23+(56$CL-\hDt`wƤШɯʰ˯ɪ{wrdx]MaHQQ5QQ5RR6,03,03,03,03./1./1./1./1/////////0/-/.,/.,.-+.-+/-..,-.,--+,,*++)*+)**()+)*+)*+)*+)*+)*+)*+)*+)*+)*+)*+)**()*()*())'()'(+)*+)*,*+-+,.,-.,-/-./-./+*/+*/+*/+*/+*.*)-)(,('0,+0,+0,+0,+1-,2.-40/40/:12;23;23<34=32<21<21;10<1/<1/<1/=/,>0->0-?1.@2/;60;62;83<94=:5=:5?82A60F5.O4-W5+b6+n8,x:-<,<.:6<5=5@4A4B3B2@0?1@4B7B9@6?5=2?2@-?->,<+;*;,;-;-;,<.;-<-;.;-;,;,9)9)9)9*9*9+~8,}9,=1=4@7B9E>HCKFMHIAGAJFSO\Xh`{ny~w{nixacr[ZhQP]IIUACL;>D60-?1.?1.96/:729839839:4:94;83>71A2+I2*S2)^4(j6)s8*|:*~;+84:5=4@3B3A1@/>-<-=0@4A7@7>4=4=3@-?,=+<*;*;,;,<-;.<.;-;,:-;-;,;,9)9)9(9*9*8*~8,}9,>2?5@7C5.>5.>5.=4-<3.<1-=2.<1-<1/;0.=/.>0/>0/?11H-&C1';5)2:++=-(=.-;.45-?-+H()R%(X((Z.+Z8.[A2\G6wC-{B.C1A3?1;0:/8+;->.B1D0D0B.?,<*6383:2<1@1B0|A/|A/C2A1>1=0;/:.9-9-v:/|@5u=0n9)s@/s@/t<+{@0{<-?4D9H?LANBQCRCHKTRd]ue{lwsz|yk{awhea]\zV[sS]mR[cLVTEPH=J;6G53B,/=&,:#+:#-9#/8".#/-#-,$-,&*+))+-(.1'/2'/4'06&14'14'13'32(32(30(3.)-0,-0,)//'=>0WZErx\gspqrrs{{z{~}|zvroi{e[jWLZIKO@CG8>B3/0*01+01+01+12,12,21,32-43.63.74/74/63.61-50,50,7/,7/,6.+6.,5-+2-*1++0,+0,-/-./-0--/-,1+*/)*.()-/(//(//(//(//)-/)-.*+.*+/+*-,*.-).-)/.*./)./)./)..0....../-./.,/.,1-*3.+3.*5.(6/)8/(90);0*<2)=3*>5,>5,>5.>5.>5.=4-<3,=2.=2.<1-;0.;0.;0.=/.>0/?10F/'D0)A3*=4+96-85.83-<1-?-+D*)K)(P*'U.)[4-_:1c?3s@+xA-A0?2?4;3:1;19.<->.A0B1B/A/@/93:3;2=1?0@0@/?/A1>0=0;/;.:-:,:,w9.x<1s9-n9)r?.s>.q9*u:,}=1@5E:H?K@MBPCQCDJQRd]vfp}w~w}oxag\`VZU}XWyXWpSPbJKVECI;@A998340-0,+/+,.)--(,*,+)+***,+),-(,/)-2(03(03(02(02(10)1/*1-*1,+3,+32-12./0,)--%9:,TWBox[iolnpppw{xwy||{xuqnh{eYjWL[HGK<@D5:>/12,12,12,12,23-23-43.43.54/74/85085085083/72.61-80-80-7/,6.,6.,3.+2,,1-,1-./-.0.1..0--/,+0+*/*).1'//(//(//)-/)-/)-.*+.*+0,+0,+/.*/.*/.*0/*/0*/0*/////////0./0/-1-,1-*2-)4/+70*90+:1*<1+=3*>4+?5,?6-?6-@7.@70?6/>5.=4->3/=2.<1-;0.;0.;0.;0.<1/=20C2*E0+H/+L,-N+/M*.J*/E+.A-,@.*@/(C/(M/'Y0*d1-j30i;+o;-w;0=4<4;594:4;2=2>2@1A2A3B5C6=2=1>1>0>/=.=.=.<.;.:-9,;,;+~=+z=*}=3z<1v:/u;-x@1x@1v<.v;-?3B6F=H?JAKANCPDDHQQc^ugnt~}{ak[eXaV`W`W]QtVMiPC[E=RA6F9/<2*5-&1+%.)$-(1&*1&*1&*1&*1&*1(-2).1+//*0-+0,+0+,0),1(-1&.1&.14.24.0.*'**"66*PUAmv[~ik~hjnn~mqx|zwvtuwyy}}ywspmh{eYkUL[HEG:=?28:-23-23-34.34.34.45/54/54/650961961:72:72:51940940:2/91.91.80-7/-4/,4/,3/.3/.3/01/01/00.1..0--/,,.2).2).2).0*.0*,0*,0*,/+*1-,1-*0/+0/+10+10+10+10+11111100010.10.2.+2.+3.*91.92,;2+<3,>4+@6-@6-A7.A8/A8/B90A8/A81@70>5.?4.=2.=2.<1-;0.;0.<1/=20=20?5,E2.O-.W(0]#/\"0W#/L'.C/.:3-55);5)E1(U.'c+*l*+e;/j;1s=3}<6;8;9;7:6>9?9B9C9B9B9A9@7B/B/@.@.>-<,:+9+8*8*9*9)<)z=(w?(t@(=3{7,x8,z3/>3/=2.=2.=20=20>31>31>7/C41O/2Y*2_%3`#2Y%1N+1B3077-39+68*?5)N1)]-)e+)c;3h<3r=7z=:<<<=;;;:;9>8A:C;CJ?K@LDOGSJycL~hSoYu]}biu|~|~|}{yn}lylwkwmtjogl~dbqZ[hTSZHIK=B@4=6,8/&5+":&(8%'6&'2&&0(&-)(++)).*'+*&,*&,*'+*'+,)*,**,**,-#$2*(50,85,BC5UZFfpWn}^tcqbtexiwkshsiwmzmxlwkvlyq{u{w|wxuzwwtqomhd{_WkPJ^CFB9>:195,560560671671782782872872983<94=:5>;6>;6?:6>95>95?74?74>63=52;62:5294194184184195484373243132021/6-.6-.6-.6-.6-.4..4/,4/,40-40-40-52-32-32-43.43.431431542540841850940:5/=60?6/@7.B8/C9/F90G:1H;2F<3F<3F<3F<3E;2C90B71A60@5/@51>50=4/=4/>42?53?53=82A64I35Q16V.6U-5R/5J22A62::08<.9;-?9)H6*P4)U3)]2+c4.k62t76}77897978}75{:6|=8{?7@9@:@;?;|E0}D0C0A/=.;-:-9,8+9+:+<+{>+x?+uA+tB+2,2,LEXQA8|90F;J>yH:zJ<{M@|NA~NBPEUJYN_uNgwRtzX{^|bis|z||x~tyqvponpp}pxmskk~bgu\_iQWZGPM0%:,+7,*5+)1,(-,'+.').((/().(+-*,,*/+*3)*6',7&,9&,2)$<3,E>4JF:QR@]bLgqVizXm]j\j]pbqeodoerhukrhqitlxrzvyvyvvtwturokjfc|^UlOJ^BHA9@91;4,671782782782893893983:94:94=:5>;6?<7?<7@;7@;7@;7B:7B:7A96@85=84=84<73<73<74<74<74;74:6395284173080.80.80.80.80.80.61.61.61-52-52-52-63.63.54/54/540540651952:72=84=82@93?80A8/C90D:0E;1H;2I=1I=1H>4H>4H>4G=4F<3D:1B8/A60B71@70@72?61?61@72@72A83=84@85B86D97E:8G96G96E:4C90B90B:/B:-D;,F:*H;*H;*].&b0)n3/x7398;;<<>;A>A<?6}=4~;3;5=8>:~C3B3A2?2=1<0;/;/;.|=.{=.|>/|>/|>/}>/}>/.*;8kf~yZTC3-<3,92*41(01).1(+1'+0)/0*2/*6,*:*+@'+D%+G$+H#+A7+LC4WP@[XE`bLgmQiwVj{Wl[gWfWj^nananbrfrkohniqnwsyvxuutssutspnlicb{[TmMH`@MD=E<5@707827828938938939:4:94:94;:5>;6?<7@=8@=8A<8A<8A<8A<8A<8A<8@;7?:6>95>95=84>95>95>95>95=84<73:51940:0.:0.:0.91.91.91.91.72.61-61-63.63.63.74/74/74/540651961;83<94?:4@;5B;3A8/B90C9/E;1H<0I=1J>2K=2K>5K>5J=4J=4F<3E;2C90B8/B92B92A81@72@72@93A:4A:4?74>95=<7>?7?@8@@6D@5J=4J70N5.Q6-Q6+O8*M:+I<)H=)l3(r6,~;3@:DAHDJGLHQJMDD;;28-7-91;4?7?7=6<5=5=4|>3y?3vA3uA3uA3y?3}=3:38373%$<;{zhcG@K@wI:mNfW@jX@r\E}aLeQj{O{{Uw\l`^_R\M[O^muxx΅~}xurruuus{sxrqlphiadtW]gLVX@LJ3GB.L40H3.D3,?2*:1(70&40'40'81):/+?-+C++H(+M%-O$-Q#-PE1[P:d^FgfJilOnuTm{Wl~VkZgVgVm]papbrdvhrlokmipmwtyxwwtustutsqokicb{[TmMGa>SJCKB;F=69:49:49:49:49:4:;5=<7=<7=<7?<7@=8@=8A>9C>:D?;D?;E@8C>8D=7B;5B;5B;5B;5B;5B;5A:4A:4A83A83A83@72@72>71>71>71<71<71;60:5/85085074/74/761961961:72<71=82A:2B;1C:1E;1F<2J>2K?3L@2N@3N@3M@7M@7L?6K>5I<3F<2E;2E;2B90A81A81?80?80?82@93@93<5/LE?IB:E<5OB:K:2J3+\>6Z5-`5.`4+^/'\0%b8,g@1gB2I;G;I?LAF>>7=6D;NDQEVHYKPB@5:0=49;9:675496@:{@8o?3oC6lB4m?2u:27435-3(1EEbaEDWUyvVOFd02b22\31L)'D'#I2,J70F5.E2,E0+H0.I-,I)*O+-V24VK/`W:f_BgdEkoLu}Xu]oWjWlXn]q`sbubudveqksmsoqosrwxzzyzxyqrmjjghdazZTnKIc@TKBSJAPG>9:49:49:49:4:;5;<6>=8?>9>=8@=8A>9A>9B?:D?;D?;D?;FA;E@:E@:E@:D?9D?9E>8E>8E>8E>6E>6D=5C<4D;4D;4C:3B92B92B92B92A81A81@91@93>71<71;60;60:5/85.74-74-96196/96/;60<8/>:1A:0C:1C;0E;1G=1J>0L@2M?2NA1NA1N@5N@5M?6J=4I<3H;2E;1E;2C:1B90A81@91@91@91?;2?;2C:3G81I0,V..j68u99{;;ECD?H@I?G>JANHPLMKE3C2B4B6>36-7+<0C5@.@.E3F6E5H9N@KRGN@F9=8:?=>?_\XQ@5UDvbJa]@Z_?ekIonOshJ{fKkP]V][SZ7SD=]P.dY9ga?ifCnrMz[zbt^r]o]o^q^ubwcwcwcrmwrzvyw~}z|qqljhc`yYTnKJdAWQEVPDUOC8938938939:4;<6<=7?>9@?:@?:B?:C@;C@;C@;D?;D?;D?;FA;FA;FA;E@:E@:G@:G@8F?7IB:HA9H?8G>5F=4E<3E<3D;2D:1D:1D:1C:1D;2D;4D;4C<4?80?80<71;60:5/:5/94.94.96/96/96/;7.<8/@9/A:0C;0E;1F<0I=/K?1M@0M@0NA1M@0N@5M?4L>3K=2I<3H;2E;1D:0C:1C:1A:0A:2?;2@<3@<3A=4SEI?MAOBRJSRNSENE2B0@0?1:-7*8+=/E4>+7$:%>+@/B2C5/89BDLKRNRLLB>}:1u;/q9,s5*2-478@?:A@;BA4G=3F<2E;1D:0D:0E;1E;1D;2E<3E<3E<3@91?80?80<71;60:5/:5/:5/96/96-;7.;7.=9.@9/C;0D<1F<0F=.J>0L?/M@0M@0O?/O?/O>4O>4N=3K=2J<1G:1G:1D:0D;2D;2B;1B;1@<3A=4A>5A>5Q9/X+&:?P`OeOfPcGO20:/?.C3F=FG>H2BH6F5B3@3?1>1B4D6G5B/<);&<(:(5&3$7<8>7>6=9@?:BA4G=1H<0G;/E;/E;/E;/E;1E;1D<1D;2D;2@9/@91@91?82<71;60;60:5/;7.;7.;7.<8-?8.A;/C;0D4N=3N=3J<1I;0G;/F90D:0D<1D;2B;1@<1A=2A>5B?6C@7_4-t42KSYiH_:Q2C#+/)9(;&=)@3A=:?0;D4B3?2>2?5C7G;J<>/?-=+:)9':*;-LDTLTNKJ>C3>.<5+7.0+9482@9[PUDxO9~dIlPbF]FeTqdsjb?eAiBkBmAm@o@o@qAqBn=hEmJpGhMiZrbsYc@D]($M-"PC2PR=CO76H.WH1eYCujT{gy~þþyvh{e\sWTmONiHTYBUZCW\E560560671782893:;5=<7>=8@?:B?:C@;DAGB>GD=GD=HC=ID>IE0I=/G>/G>/F<0F<0E;/E;1D<1C:1B90A:2@91@91?82<71;60;60;7.;7.;7,<8-?8.A;/D0K?/M@0NA0P@0O?/O@-P>2N>1M<2L;1I;0H:/F90C9/C;0B<0B;1@<1A=2A?3B@4C@7t50FEY_Ub@Q5F0;*+1%9#;!: =&=.902-:,:-9-6,91A9E;E:?2@0<,6'6)=0D9G=9*@4D=A@D<@?>C>JBRMZWPREL;G6F2D/B1G6L:T:T:T:W=\?aBeDih?jAm@n?o>m=mFn:a>dInJlMmSoXnp_jILt:6\6-O9+OD2SN:`PArdW|p̿m~k^u[VoQSlNU_DV`EWaF560560560560671893:94;:5=<7@=8A>9C@;DAHC?HC?GD=HE>ID>ID>JF=LE=MF2G=1F<0D<1D<1C:1B;1A:2@91?82?82<71<71<8/<8-<8->7-@:.B:/D2B@4@@4+)JKSV=B/6.3./0)1 9!=!== =#;#6"6-8/5.3,71@:B<@6B7A57`UqeSWCN:XGe[a_PTBIDK@D@?BHC?ID@HE>HE>ID>JE?JF=MF>MF2G=1E=2D<1C:1C:1A:2A:2@93?82<71<71<8-<8-<8-?8.@:.B:/D2??3@@467]_Z[78,,/,,#0#8$B(G*G'F$F$C!? 81;29250:6B>D=>7<3<272:<$:*.($&''%%(,)2*5*3(2'/&-%=(2>05)7/?7C9qdm]YFVEi\lfSS@H?L46,4.44BH8G2F3H5I7GY=X:W6W5Y5\6_7e;k:m;ot>vEbNkTqIf?\Rqff^wbvkys{rvfeZVTN~ĻþĪyvi|f`w[\uWbqRapQ`oP201312423653875984984983;:5<<4==5??5AA7CC9EE9EE9HH@HH>HH3B90E<5C:5@85?74@86?67>56:44F85E76B87@78>:;<:=<<>==????A@,B0D2D0B/?,>*<*=-C4F7>03&6+8,:-=/=.(9%44 9%8&6&@4QEIAMIUUVXJP9A4?9DCHCFAA?;=3=/?/@0Q@QCLCC=??@E>G8CGMENEQESAR=S>XCbGiBhHH7H?8F=6C:5C<6A:4?74?74@85>95=84;63>3/=4/>42<74=98<;9=<:>=;@?;C@9G@6J@4L@0O@-P?+P>(=B,?A,E=0H92K63J46F35A57>=;8=69?5?A4C=-J9)^B4sRCK=;-2#6&:'8$9%?(;%=(@,@-=,9*6(5(;+:*9);+?.B/B/@.?.:(<+E6H9?18+7+5+7,:.;/=/;/8/4/0----+/+4)8(;'=&:'7"8%=*;*5&;/G8;1;-<->.F5M?NEGC?@>B>F>HDJCLDPFTBS=S>XBaFhCi?i@lBpGvJzL|IxHtKpRs]z`{XwMqCkAlCjJg^ppugNIv̲Ų}/.,0/-10.21/43/540762761:94::2<<4>>4@@6BB8CC9DD8IF=IG;JH;KJ8MJ7NL7NL7OL9KI:NKBTSQ_^dihxmmlkihcYd[QZQGPJ@IH>FG>CC=A@::1>:1=90:3-94.;60=82=:3>;4?<5?<3C?4F@4I?3L@2O?0P?-Q>-P>*3@&7?'<=+A;-B8/A62>42;31=85B:7H94O2.[+)o-.:=EJ9+2$1"9'<)7$8$<&;&=)A-A/>.<-:-:.>0<.9+:+<+>->-=,?-9(>/L=H:6*2&;05*6+8,:.;/9.7/2,/-.+.+0)2'6&8$:#7$5#8'>-=.7)8.A7<5?8EAKIIJCC?A@CDCC?B;=4:.9*;*<+9)E8NEIE?@X@_DfCiDmFpIwK{L|K{CvGwJtNtZ|aUvCdHkRv=\H`z}~\F;rճξ/.,/.,0/-10,21-32.54/650872991;;3==3??5AA7BB8CC9IE<0?=1@<0?<-A;+F?/H?.K?/M@/O?/P?/Q>/P=.<@)=?*?>,?<-?;0=:3;:5:94<94D95N43[*-o&--83C7H7)7&9(?-?,9&9#;&:&<)>,@/>/<0=/=0@5=2:,8*9+:,:,:*;,;-B4E9?31'2(:13+4*7,8-8.7,3,1,0,.+.)0(1&4$6 8/04$;,4Vet͑]=2aP@wlѥº10,10,0/+0/+10,21,43.54/77/880991;;1==3??5AA7BB8KD:LF:OG:QJ:RK9SL9RM:QK=OKBVTUfdowxÎƏ{wrlid_[~UPnNJaJGXEBM?=B;7696196-86*86)581692891;;/><-?<+C<)D<'I>*J?+L?,M@/M@0M?2M?4L>3M?4K?3F<2B90=909:25<44>57<5>:1H3.\0/{48;D9E2A<+<+@.A/@-<'<'>*8%:'<+=.;/;.<0<1A6>3:/7,7,8+8+8+7+A5C88.1&3)7-6-2+3)5+6,5,4-2*/*/,.*/)0'1#4!67//2"5)9-:0?6E=F>@9<5@9KDNGF<;1=1<0C>EBJJTJYFXCYB]@_BdFjJsOxOzLyIxGwRQ}IqImStVtNiD^F]YkKFd2)jc͖ɿ˾Ⱦȿ84163.52-30+30+41,52-63,85.96/:70<90>;2@=4B?6B?6KC8ME:PF:SJ9TK:UL;SL<=;:6;8396/267465672880<:-A<)D>(G?(I?&J?)IA,JA0IA4IA6HA9G@:R9?46<*=+?-?->,>*?+@-8%9(:+:+9,9.:0;2>7;4818.8.9/8.6,7-C9?50&,#7/<44,1*1*2)3*3+2+/*.(.*-)/)2&3$5"7 75#3#2$2&5)7,;3?8YRRJHAD;F0A3A6<5<6A?EEGIJMMQAD?ECIJTN[JZF\F]A]BaEiJpNwOzMxKxR{R{OvOtVw]{SoD^UjQddt`cKLkeώ<94;8385052-41*41*52+63,74-85.96/;8/=:1?<3A>5B?6KA7MC7RF8UI9WK;WK;UL=SJASJK[Xcnlǚޞ졩홛敘ߔ֐̈zzrqfd|XWiPN\IGRFCJDBG=?K==G;:?;:8<92A;-D=*F@*F@(GA)GB.ED2CC7BC=AC@>BAG9HH,>,?+@,@-?-=*8'8)9*9,8-8.91;3;4:3818192:2706/<3>5912*3*;2<35,0(1)1*1+0+/)-(,(-).)0)2(5%6#7!8 8%8%5%4%4(6+7.7/NGXPZQRIH>E9B5?1<&<&<(;'9(;*>0@4D;?9@:FCIHHGIHJMCFADDIKSQZN]L]J`D^DaFfIlNuOxOxNyYzWvVuYx]{ZuQkI`WkUgN\^kKZSaSaQ_jfɂ~窧@=6=:3:7074-52+52+52+63,74-74-96/;8/=:1?<3@=4A>5M@7OC7RF8WJ:XK:YL-C@-CB.BC3AE7>E=UEYFL7A+A+@,A-A-A-A.A/=+7&7(8)8+8-6-7/8/;2736161729494816/A:8/3*7/=5=58/6-0'0'0(/).)-)+(+(-)/)1)4)5'8&8$8#8$9%7$6&7)8,7+4*3+NGd\`YOFB9<2:/?&>&=&;%9&9*;/>3C9A9E?KHLIGDFEJIFGCDDHMSRZR\N^OaG^GbGdIiNrRvRyRy[u\x`}_|UpMgPgYn[mbsL]SdM_RgI_E]d`tqښA>5@=4?<3=:1;8/96-74+63*52)52)63*74-:70=:3@=6B?8J@6OC7RF8VI9WJ9XK;ZL?[NHTIMXR`gd|}̗瞩꟡ܙҍurhe]ZXR~YP{YQxVOpOG_E?M?:@?;8@@6>>2@B5@F:>E=:C>9CB*?,@.@.?-=,;,6'5(6*7-7-8/91818495:685616183:3C<=670@7[Rlc]T@71'2)1*/)*&'%(&*(-)0*2)1%0#1"5$:(=&=&=)<*;,9+8,6-@871GAc^XQB<@93.<#<$<&<&:(:)<.=2>4C;PJXTOJ@;@:KEFEFEJKPTQWNVKVL\RdOfKeJfMnRsRvPt[wZuZu[w]xZsWnVictVg\mYlDXBXMeIbnhhcˎ赲C?4B>3A=2?;0=90;7.:6-95,73*73*73*83-:5/=82@;5B=7I?5LB6QE7UH8VI8YI9YK>ZMEUKLXP_ebyzɔ䚧䘘،ɀ~uqieb^cVbU]TWOtNHdFCTBAIAAA;=8@C9<7<7=9A=C=B\Q?46,+#)#,)./,-((0.4/7/6,4)2&3%5&='<'<(;(:(7)6(4(8/5-<6PJSOLHA?/,=%>&='<'9(8(9,:/>4B:OFWPQKD=B5JB7ND8RF6TG6WG7YI:YKBWKKXP[b^wsuޗ뙗Ղxtqml`i]dY^VVQyNKhEDV@@J76;?=>HBBKABN?BYFJmX_}fnt}}wpcRpE^I\EP9<3,7(;%; <*<*;);*<,<-<-<.6*8.<1>5@8>7<3:273403/93A;E?A<<5<44,4*7-2', 6*H@64--)+*+,+,*,))/+3,5.4+2(2'2':&;'<(;);*:,8+8,4+;4:5<7ONXYEE02=(<(<(:'9)8*7*7,>2A6JAUKRIH>E:H@IDHCLGSPSSPQMQNWXdZh[pZrUoQlPnRpFmOvZ}[{VqSkVk[mYhYh`m`k\fenfmT[cY}NDlfØ߹IE9HD8FB6D@4B>2@<1?;0>:/:6-95,95,94.:5/<71>93@;5E>6HA7LD7QE5RE4UF3WG7WIC_@EmDJOU]fjreklf]TyFg8U0H>PBM:<7/@.B*/?0@3@36*KBJE50FFZ\HK?B=-;+:*:*:*9,9+8,<0>2F9OBPDH3A=2=9.<8/;7.;60;60<71>93?:4B?8EA8JD8NE4PE1TE0VG4XH9ZMEVMR[Whkl~В噧铕⊌لӅ{umjdd_aX[QQsNHbUFY_CRlBLEOLVU][d]fJuNxPuLnFc?Y5J+?5EAMFK><>6H8J6B)>-=-<->/?2B4D7E:E9B7>5:26-5,3+2*1*4-6090807/6.5,/&5+6)2#1"9)>-<+=-D7KAD?56)-)-.26755301,/,/,0-/-80:1:1<0<0=0?0>17+WL`X;6;:OQEHOT=2:/8,8,:-;.;-:.:-<.B3H9I:D6@2>0E3;18/4*3*4+4,5-9/<2=4<3905-5,6-.$;.<.1".8$=);&:'9+:1=9@@;?27+1,.+,+)+(/.4488:;5564736/7-5*5(5&5'PEmcHA42CC>BUYB;=6706-9/<1=1=.9)<+@.B0B0?.=,<+C8D9H=PGSLOIOJOP_caiitm|duUjRgWoSxUtWp_poyy~msXaam`maos{숊ɂ|wjyhhpYMO:^WGqgݿSM=RL4D=5B;3A:4@93A:4A96B:7@A;CC;IE:NG7QF2RF.UF/WH5XJ=RHFXR\jh}ƒږ奦띤蛢晞⒚ۊ҅ʂ‚ymczWiP]KWGP?H9A;6<5B6H7J5G1D.@/UGG?;76488:;9866=.<.;.;,8+6*3)1&5*3*3(2)3*5,6.7/>3<2;18/7.6,4*3)3&3%4%6&=)>*9$2;(5%3'60;<=@7=27-1..--0.449:;=;>.4/3011/1*2(1%3$2#>/j_TL95@@:=RUJEB=935.8.;0<0=-<*?-@.?-;(;(<)=*>2>2D8LBPFNFMGNLbcbfhqo{hxYmUj[pXs\tbqkt퉇yy_dhrl|cskw餟z\pWFRRL4:B*D)H)N+O(L%H%D&WBF8;5>>BH>F5>08F8E7D7A3=08,3)0%0&1(2(3*5,5,4,4,C8=27-7-:/9/5+1'7*0"0!9&9%5 9#E.:&:)7+3.//055;;BIMGJDD@@>>9:28.4'/(/*.-.0+2*5)7(0!/eY]TA,A/B0=)8%9&;)>,8+8+>1GTK8>=@D@HB;D;BCG99B@D@/-HIHKAG;D8A:?<><;<9A=>9C=LCK@>27+;-9,8-7-3,0,/-1134A19)1 1"8(;*6%22454 3"3%3(3).(2+6+8*8(7&7%6'3'2,3101+2*2+4-6+1*/+,.-4.8,7(5#.3 XHZL<2OG5/IFQRLKDB<8807,9+;+;):'9%:&<)=+=+=,9.;.=1?1?1@1@2A4k_qed[mirocbjituk|ivdm_hafgjnkqk|w}Yj[wZpaz]sMIZ6LR6snX˷YPAXO@XO@VM>UL=TKD:B7?7;89:8;7F?<5<4G>LAC7;,9+7*7+7-4-2.3/5366?0<-6)4&6%6%4"4:":":#;&<*;,8,5*3.5-7-8*6&4"4!3"2$1(/+.,,-,1-3.4*,,-0.2.3*5'7'9'@,*E5?1F>WPC?BAWVRRKJC>=59.9+8(;);(:';'>+?-@/>-9.;0=0=1?0?1B3C6i\mdb[kfolbakluvpo|ir^fY^adqn|vyux~RdUrXnXn[tLN_;QZ;us\úZQBYPAYPAWN?VM>UL=TKCC>C;C7=?AA@D?=896WWBC=B:A7<586696;6HA:35+A5K>H:=/8)7)7+8,7.606387;;5)6*6*6*5(7):*?,556 7"9)8+4(0&=;>8=5*B/1 TE<0A;C?JITSVVSSOMIEC;<28+6&7&7%7$:'<*>-=,=,:.;/<.=/=.?0B4E7\Og]aYlgpoabfgkoP`^khqem`edgqqzwvsnuJ]MjUm񜡟PcVoEOd=Va?ww]\PB\PB[OAZN@YM?YM?XL>XL>UI;TH:SG9RF8RF8RF8RF8RF8JF=KG>@FCA<71>:[WAB?C=@:=8997=8A:E;9/2(/9(8)8+:,:/8083;7=:3+3,5,4-6-7.:.>/9(<)>->.=/=2>6>7?>?*<(=,^PF<3/.-?BUXvurojg^YPIA75(.8'9&8&:)=,=->,<-<.<.=/<-;->0B3E9MA`Wa[pltr`a]a^dFVYegpgodljpstxvssenCXEbRk뒘N\Ql?Ri?ZhDy|_\PB\PB[OA[OAZN@YM?YM?YM?WK=VJc7U8IAEFAIAIAFCAG;J9JDI>A@?JE?83,D@>?>=@'9&5$5'9,;0:/8-?1;-8'7&:'<)=';&>-:*>2B:.+::142673;7C>JEQISHTHUG?0>.<,<->.@.?/?.=0=.<.<.<,=.A3D6LAbZc]nlrr`c`e`gixozlt`h^fkqw{{|pq^h@W>]Oh懍XaXuE\vIgwPfŻ㾺޺޼[OA[OA[OAZN@ZN@YM?YM?YM?XL>XL>WK=VJPI?QI>SK>UL;XM9YM7YM7XM;WK=ULGYSWc_nmktt|~ȍώԏՍӐӋʂ{u|ovgpckn~eyZvMo?c2V0L6G@CGBLBMCIGCJID<45*I@LFCA>=:;;;?=E=H(9$8$8&:,?1A5B5A6I8B1<*:&<)?*<)9&;*6)0'B<1/>A.2'-3-4.71928.5*2&1#E5A2=.:+9):+:,:,/=.<+=,?/A4SGg^d_kinochjqoxp}t~mwcjdlqzw|sukpXfAY:[Kf}lojXoZx`rū٫ӦѥԩԮֱںZN>ZN>ZN>ZN>YM=YM=YM=YM=XL@E@JBKCHGBL8E;F9E68(:*:*:'8%:&:':&9&:);*9+7+5+3+4-)-)/,3.4071828587;8<9?9A9D6G6H5J)1,2024/7-9*<+=,7&9*2?4>4?6?6N0/-.38384-6.80:1;1;0:.:/L?F:?29*7)7*8*8*<->/?0=/<+<+<,>0KAc[c^kioshnrzveroyr{jslvvu}ioflRbA[6YFat{~zf{fhu˭շˮŨґēș˝ˡΧҮٻǾ[N>ZM=ZM=ZM=ZM=ZM=YLXL>YN<=A=E?GBDHAK=M:OBAGDA583.,)&.*:3C9D6@0:(<)<):';(=(;'8%6"7%8)7*5(3(3)3*03587<38,2&-'-)1,3'0%/'6+=(A:2".&0+10/1,4+5)6*6+90>5>7:4615061L?K/6(3%6)9-5*6-C<7421 89352(3)4)5)5+5*5+7+YNRFH;@4=@ABICMAN>NA<@9?6?3=/=0E8MD61;61.2.C.&/(<7E@:7/,.*41:7?3;.5)3&5*:.;08.bWZOD86,:/9-3)6,1%2&2&4'7':,<.=/:.C;\Wppsvv~yq|{xu}s{r~q}lxisbmI\=\8[:Vek}~i|d}cju|vxqwo|rtwuy§̹־ʻZM1B6?6?8A==;:<:@7=4<16;3:06-2.314364/:572DADA/+2."41?/E5G7C8?9=<9>9A:E>GAH@E@B<4908-:*9(:*?3F9665:7C=OEI<4%9&:'<)=+>,=*:)9)8'2#/#4*=3?6912+7&6&3#/"-"+%,&+(++(+'-(5%8523(5.;4?8C;D+616=8<7=4<2;/:.7*6);/@8TMgeorz~{{zxwsl}ftbn]kG^:Z9\AZ_cgk^eOhOlRtX{\}^x\qX`yO_P`UeYm`ug{jmptvyyz~ǹ˸̴[K;[K;[K;[K;[K;[K;[K;[K;ZJ:ZJ:ZJ:[K;[K;\L<\L<\L<]K=]K=]L<^M=^M;^O<^O<^O<`P@^Q@]P@\NC\NE[NF\OI]PJ`NdcSmfX{g^ohzu|{yxucOyAF@@A=F;J;J;F9B:@?;A:D7>850-&:)8)5(2'/'.',(,*+*(,)1+7';";="A8G(6/;P\`lP\^N>^N?^N?_OB`PC`OEbM\cPdcUodZlevr~wv~‰ЁwkXuFf=MDPJNJHG>GBB>C>G@HCIDDB=?9A5=/:+;*:)9*<.?6FB<;ABAA:8JBXLL>@08(3#8(<-:*7)8+0%3)8/;4:3500++'4,4-2.314345586;/4.60=2C.F*G,L1TP3D2A3>5<89733*/$2*-(61XT\ZXV@AHHB@<7706-8-9+7'3!:%9$;(=-;-6)8.>5NGEA501->9?:8171/011427392:/9.:.6*7-IB_Ynl}v}x~zxsj{dt_nUeF]6V7ZF_TRvaBJoR-H:QCTDK@AA>DAEBEFAF@EBFDEEAC:?4@3;-8(9(:)9(:-;3IE??;>682/A:ZPg[QCA34'6)9+8+6+8,0&5-;4:440/,-+-,4;3;3<2=1>0=0?0@1A2D5K5O0P-Q1X:d7BO\an`nXfQbEX8J@S:G2;/23-9-=+>(9/2(JBkcLGPM<9;9LJ@<7/7-(;%=)?-9)4':1C=HAC?722.;7:62.2-)++,.-3/61:1<1>26)4)B:XRjh|}v}y{xqh{bt^oSeI`9X9[I_QNmZ:Em8ZvCa|InSvY|]bgll{m|o}p~onllqqrronptvtwï̾ŽӫZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8[L9[L9\M:\M:\M:`J<`J<^K<_L=^M;_N<_N<^O<^O<_P;_P;aPH$H0Q;UA6>1?19+7':)=*=,>1>7=:79/3/03294NElaj[QCD>61;7UQF@918-:,9(:&;%B)<&<&=*8(3(=4MFGCEB96307341/+2-)/*/--0/4/7/;1>2:,4(;2NHb^yzz}}xn~dw^p[lN`Ha8W7YH]JGcS1Al6ZtDf~NuZcfjnsttr}p}nmlknpoolknpsrwƱοŷҤZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8[L9[L9\M:\M:\M:`J<`J<^K<_L=^M=_N<_N<^O<`Q>aR=bQ=bQ=bR;bP:aO9`N8jNMgNRbQ[cWkjfuv}}y{˃{|qsgjTXAG#M.T7W9P>NEMEH?BBDAC@AA?C?B9?4=0?19+8(=,A.B1C7D=6457,002880+5-UKzn^RD7=0<06,6+90708271401/105387=>>>==<=:@$I&N$Q%U0e=sgralXeR_Q`M]?R1B:J4?-0-(5'>&C%E"7&9(WH<0A87/3/C@XSHA916*6&5$6"9#B*<%:%<*7&3'A7SLIEGE:82.411-.)4.'-',)+*)-(1*5,9->13(7.HB\Xwu~xl|`sZlXiHZE^4S3RCXE@\L*?j4Uo?d|Lw\hlptx{xt|mzi}ghhkmmlj}ilostx«ǶȻӞ]K7]K7]K7]K7]K7]K7]K7]K7^L8^L8^L8^L8^L8^L8^L8^L8\J>]K?]M@\L=ZM=ZO=\Q?^SA_T@_R?^Q@aQAcRBdQCdNAcM@pKEjKIfOUgZknlv|}̃{~uml]fRN[DQ>LANCQ>K:G4;/8+:$C0=,6(?5D=;56183716-7)9(=';"774PLXOD98(?.C3;-4+GD.14;4?+9@Q(9&+*-*-"#$()(("+1 )&1.<$5Yn+@`j^iYcT[PTHI@;:1A2F2D.;$57#;)=+8183EC;9234544CAKFKED;:04+4*3+2*?19,.#',"7/C:G=PFE;801*/-01/3.4141201/00.1+4+8-=/2#?0>3`Wtqwe}[wXuSoJgDc7Y9]>[]kC=PI/F`;Xw^N?^N?[N>ZO=\Q?^SA_TB]QA]P@_OB`NBbPFcOFcOFkLGjMOgS\h_rnow~~̢wx|xuhjYZgN\FRHUJVER?J;E9A:>::=:?7>4+?-9(:,A6<47/<7404-4*4(7&:&;%;"52A;MDI>>/8(8);.<2JF/15<6A.68,E4H6?,1)()-':6TRHG5445<=WUGBGAB99/4+6,7/5.?5:15.3+4.83?9E=JBA86/1*0-1103.3141201/00.1+4+8->03$=.=2^Uvsue|[vWtQoIhAa8Z=_F`Q\{?7NH.Ga>Yx=eKsYxawbzf|i}j|i|i|h{e{d}c}cd{l}n}l}i}e}cccfkpu|zdoqR]_]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8^K<_N>aP@`P@]P?[O?[O?[RC[QE[QE\OF\OG_PKcQOfTRhTUiTQiVXi]kmisvz͉ٟ֗ʪ}烅~tve`kS\GQFQHREQ@K=G6=7:99<7@7A4?0=-@-=+;*B4I?;20)926/5.7,7*7(7$:%<'3/4.A9OCH:6%3#@2>5HD134;6@4@ES3A),"&#&03--''%%12(*7:+1)13?R^=KYiafV\OTMREI:;74?96,?2C5>18-3),%' % 0*FC::,,44AB^]>:C;A9=39/=4@8@9A>=;>=A??>;9?=IDA;=45,2+2-3112/2040201/0/.0+4+8-?14%9*;0[Rzw~rcyZtTqMmFg=_:^BbQg?Fn<1OK2KcA[z?hLrZu^t_wc{gzgyfyfycxbyb{a|b}byj{j{h{e{az^|^`hnstwvypngVb`COM4@>^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^L6`N:aP<`Q>]P?ZN>YPAXPEXOH[RM_UTcWYeX_iYcl\fm]hlbclemolrtx~τߊ狇ޝ٬ɳy{߁yvnrbgU\LUFPBM>G;D5;7:97=7A6B4B1?.;,=/>0G:RGH?6.1)9181;0<0;-6%6&9'402-=4OCK=;,8*B67.>:/0164<8BNZKW>C38$&/1,,22+*0.::37-29BENYcLY?AADCF>C9=8988:58391:2A:NHVSNNAB82:5KGNLQRYZRQYX51>6C9@7?5A9CC:?58=?LJ93704+3,5.302101040201.0/.0+3+8-@26'6'9.WM}y{ocwXqNmFh?c8\=`IdYh25d<0SQ8TgG`}EjPsYt\u^wbyeyfwdvawav`x`z`{a|byhzg|fzbz_z]|]~_emrsustii_RaZDSL8G@^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;_K2_M5aO9_P;\O>ZN@XPEXQKYQO^X\g`hnfsshysg{sg}tfnnzorrwv|y~׃刋쒍뛌ߞƞtkmqvj{illklfi]`QWEM;B5=596898>7A7C5C0A-8+@3;.;1RH]SNC;2907,9/>1=16*4'7(2-60=5E9F9C3A2?20&620/-1-47?OYZd[_OS.103--EE66,,-.>@2537ch=C*2-4();=AE7:378;89..43<9HESS`chndk[eB7Eb8_4\@aMcWap/+\A0XX>]lMbIlSt\u_v_xcyexbu`u`u_v_w_z`{a|byd{f|dz`y^yZ{Z}\_gmpst{nrffvi[k^RbU_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<`L1aM2`N6^O:[N>YOE[RMZTT_Zahbprmzu{tyrzpyoovpyt}wz~Ճዋ唏㗊ҙ~yl[X>H?PIVRVURRJM=C387<9;;9=8A8C4B0@-9.A65+.$J?h\eZVI=26)4):0;05,3)6+/+61;2:/?0F7C39+1&3-31-.*.17EJS[_d\a9<9<+.JK89//55()(+YZ?B9=7: %))=>BE49,217/5(,37KNaehncl_k_m_nNIOJ]ZVTMMGH3231AcWh[fYPB?25)7,:05,2+6.0,4/7/8.>1C4?04'4*1)2/..-.1468?COTY^FKRW47FJ889;>=A6<-4)219/>)7-:9CAHAB1/4-5,5,4-3,5/50.4.2.1-0../+3+7-:.>02$7,<3tqrj}bt]pRjBb6`5a8_KfN[z;6Y?.LH/TZ@]cIbzJjTr[v^yc{dxas\pYpYqZqZt\u]y_z`x_y^z^y\xWvUwV{X~]dhlormxgrlk}ecu]_O?_O?_O?_O?_O?_O?_O?_O?^N>^N>^N>^N>^N>^N>^N>^N>eQ6cR8aP<]P@ZPG\TR_Zab^otryx~~yxwvxwt}w}Ƃƅȸп¡ϼDzkS\FG5=0H=VQVTNO?A=?<<<;=:=5;18.82<5:3>5PDYM]PgXdWM@:-8.913-2,50402-5-<3C7C4:-3%5*-&0+.,2144.,00EIY]W\puDJHN=C[aou>C~mqQT>@02<>EI9>7==F6@-8>J\hmwitdl]g^kap]nWh_YOKJG740.54/.95D?JDJA@86/5-7194$0/<1=*6/:>E>C443.5.6-5,3*3,4/5/.4.2.1-0...+2+6-9-@21$6,7/pokcx]pZnPiAd7a8d=bPiQW^2'RG3DH/PV`P@`P@_O?_O?_O?aQAbRB_O?]M=]M=aQAcSCbRB`P@eS;aP<_O?^QH[QOZSZeapsqxxz|~}xyrsnoqwv{̋ȖäŲͭЩУѠѡ̚Ɣզg_FzgteG?QMbaIL>A799;997561949550B;=5I?XKPAeVdVYKG;:/6-6/5/3//-2,70=4<08)5(8*/$/(.)0-204051408X`~~owgoipfj\_Y[^`RYCK8B7A1>+9/>=IS_`kgpepbobp`o[lTOFA853110/.2186D=B:?7<4908183845=4;3;4<5;49331/3,6-7.5+3+2,1,2./503/2.1///,3,7.@49,7+/&<5XW~he|]rRhHeAe9b5`JlRd==K. >>&?I.IO5]]EWlAcxMqZxby`t\rXqWlSmRnSoVrXt\u]u]tVtWvXwWvUvUuTtS{[{\z\uZnUc}MXrCSj>AW1?U/`P@`P@`P@_O?`P@aQAbRB`P@_O?`P@bRBcSCbRB`P@fVF_QD\OF_TRcZ_f`nmkwvwy{}}x|qtlolnoqsu|}ىԘШƹƵϩףܞߞޝܞ٠ҜʖѼ~dċw}mVJ`YqnZZJL>@<>>@:;5634=:73?86.>3L@I;^Op`aSH<5)0&5-4-/)4395<7<38.5)5(5*6.4-1+0+0,2,4.5.9;>AIMW[\d\d]e`kR]MXQ[_gjqfl[`RU07+5+5-9&5/'67DP\[dclemepdo[hP^FB<9646353202/62>9>7<2:1918295969;7:7:797957313,4,7-7.6,2+1*0,1.0503/2.1///,3,6.=2>28-2*82Z[w{a{^vWqOkFf=b:c=cLhJVw<8F5#7=#9C(DH/UP`rJnXw_v]tZpVnTkOkPlQmRoVrZs[s[tVuWuWuUtTrQqPqQnPlNhLbFXu?Nh8F]/@W+@W-@W-AX.YL<[N>^QA^QA^QA^QA_RB`SCaTD`SC_RB`SCaTDaTD`SC^QAbUM^QK[QPcYakesqmvuy{y{y~w}nseibfjnrv}zᇃᖔߩټظۤϠĘkpp`RG]Umius^_HL@D@D=@7:36>;;6A:707.?3=/G8j\j[\MB62(4+6-1*44A>GC=62)1'2'0%3*1).)/)2,7/=4A7-,43CEVX^bYaS]P[FQHSNY\fmvmtY_AG*2,41<1>*9&66EJXISOYW__fdkaiQ[BJ956375<8<9855160:3;290908183:6:8;9:999988884403+6,8-8,6,3)/)/,0.151302.1//0,3,6.9/D99/4.0,`bnu_zWsPmLlDf8_9_GfReDJi=4K@,7@%8@(ED/LE2N^9YkEg|Qr[tZqUmRkMiKhKiLkPmToUpXqZuWuWtUrTpRmMkKjLdGaE\~AUt;Li3E_/AX*>U'B\/E_2Ic6WJ:ZM=\O?^QA]P@^QA_RBaTD`SC`SC`SCaTDaTD`SC_RB]P@YNR[PVbXcjcsqmvuxzz|w|symrbi]caglrv|ȋ攑褡淴޿ܨҧßvqsecWi`rmut[[KNCG?D;?8=:8;8D?C;:0;/7)2#J;bRk]SG9.3)5+4+33ML[XKF803*4+2(-&,%,%,'0)6-<0?20(4,:6CBFHEKGPLVQ]VbXd[ggpmuY_=C.2-4-4*4%2(6@?<;857292:1908071738687<9;9:7;8:8845.4+7,8-8,7*3)/)/)/+252312/1//0,3,6.8.G<903.-*fjyjr`{TqKkFj=c3[<^PhXeDBbE7WP=DH1@D-JH3JB/IW4Sc?btLmUpXoRkNiKgIgIhKjMkPmToWpYtVsUqSnQjLgIeHdG`D]AWy=Rq8Mi6Lf6Ne7Pe:Lf6Oi9Sm=UH8WJ:[N>\O?]P@]P@_RBaTD_RB`SCaTDaTD`SC_RB_RB_RBTLY`Xgnf{tpxtxwxzy{syjq`g\b`fkqv|~Ε䞞譭齼߳سѴůy}qwkskngoi扄~sredVYLNCE>A95:7B=E?<3=3B51%1"I;YKN@=/8*6*3'34UUkh]XE>;3;2804-1,1+0)/'0$/$0#9,4'3):5CAEGBG@HDOOZVaVa^igoYaDI885526183;9CHSVa6?4;7;AFKOIM;@056195;8;9;9:77370;2;1;2:282736465<8;8;8:9;7956/4,8-9,9-7*3)0'/)0+453322010/1,3,6.7.D:7/1-21jprzhr]vPmCf_L;_ZFQP;KI4PI6MB0DR1M[8[kFf|NmSmPlMhHfGgHgIiLjOlSnVoXtVqUnPjLfIcFaF_DZ@X|?St;Pn8Pj:Tk=XmB[pEUp=Vq>Wr?RE5UH8XK;ZM=[N>\O?^QA`SC`SCaTDaTDaTD`SC`SCbUEdWG]Ulje|yu}yzywyvxswlqcj[c]ehpw}ǁІՙܡ௲廿Źxzuwvqulg~mfoib[a[smzu{|yrpccSTHHB=>:<6A;:1D:TJ>26):,=.?/A3C5?18*23LM_]XSD?;48170929292929/9.9+8))3"@2I>E>;:7;9@8AHTUaYb^g`iU[CI?:?;AAGJMRQYT]V^4:/5037:=A:?48/2619595411/20404.<4=4=3;293734333:898888987754/4+7-9,9-7*2(0&0(0*454332111/1,3,5.90<3700-AAnukucoSkIf;c1`3bRJ7QF4MB0AL.GU4Sc>`rHgMjMjKhGeFfGfHgJiNkRlUmVqSoQjNgKcH`E_F_G\E[~DWxAVr?Uo?YpB]rG_tKYtAYtAXs@NB2QE5UI9WK;XL\P@^RBaUEbVFbVFaUE_SCaUEfZJj^Nkgup|x{ywxvwptjoah^f_gempx~͉؏ܙϠ֪۴ߺ߾̼ƻŴqqstpqogevhenj`Ye_[Tg`tn{v{wwshf[ZQKGB=6C=;4G=\R;0<07+6(>.D3C2A1A08:>@DCC@=8917/7/:393:3;3>5A5E6G8.;%K8L==30+108>BJKVU`Ze]eYaLR?D4+8/<7@@DFEJBI?F5;26368<7914-2.44095640.,*/,2.2-=5=4>4<3:58565555757575656422.1*7.:-:+8*3(1&1(1*555342111/1,3,5.;24+;420UVpxcn[gKbEf7b+]1b@hKeRYd8/ZI7SN:UN;[P>VI8M@0MA1=H*CN.K[6Xj@ayGfHhIgFeDcBcEeHgLhOiRjTnPlNhLdJbH_F_H`H_H_H]~I]yH]wH`wKcxOdyP[vA[vAZu@MA1PD4SG7VJ:WK;YM=[O?]QAcWGdXHdXHbVFaUEcWGj^NpdTvqyuxvtsrrsulpbgZa^femltu}ƁЍڕ⚤ȟͦԬٰ۱ڲڵ۳ֲѮ˫Φ{|ydbgidhbY\g[[xeauXRe]OHVOaYjcvp}zwuljZUPJD>MGB9F>WO,"2'5'=0E6>-2!8%F4DF9;3262;6<7<6<6;4825.4+5+8+<.>/U;I/=';+=2;56537KRLVOYS]WaU\LSCG5)8-816455584:288<6;9=853cepy\hR_HaGh:e*]/a@hE]AFQ-!UJ8PN9OH5\O>YH8L<-NB2:D)?J*GU2Rd:]sBcEfGeDcBa@aCcFeJfMgPhRlPkOfLcIaG_H_H`I\G]H]~I`|Ka{Ld{Of{Rg|S]xC^yD_zEAC8CE:IF=OH@RGAWI@]M>`O=aQ:aS9`T>_VGaZTfaeljwrowozt~wzurohfa`^^bahgqo|xυڏ㗐흖٣ڥܦݧݦۥڦ٥֣ҢС͞ɗymrvghlc_`e[ZlYUtUPULVKRGZNZP\Smd|t~xyyyabPQEEYV611(5(7&6%8%9':+<.?18+=/?1;-5'4&:.?590907.7+7);)@+C,;3?7DC;<42*,$>5G>QHXO[RYPPGE<)<*6.648;;94:5<4;5:593736225445464717.6,6)9*:(:&9&8%8%7#7#414/4.3.4,5)6(8*:.7/96>BlyasRlGdIj5Y5];e=cPjLVT)":1 9<)EF4RL>PH;BC39E15K4FGHJ#MQ,U\:\jGcuOf}QeNcHbBa>c@eDjIlNmQjIiFgFfFfHfIcIcGdJdIc~Gc~GdFfFe~Dc|BX}8[;^>[K>^M;`O;`Q:^S?^WGa\Vhcinlyrqtnvptppmgfaa]^\\edkjtr}{φَ蘒웗Ҝӝ֞ם֝՜ҝўќ͜ʛǙēwtmtkdkf]`e[YiZSoWMzVJVIUK\RYRXRf_qjvowuufdTSYU2+/%7)7&7%8%9&:*;-=/8,9,:,:,9+9+8+8,;1908.8,8*:(;&;%4-80=5@8A9?7<4915->6H@OGQINFC;7/89"8)4,./*3(7(:+B*B)A&A$@ >=<89$;);-9297;;;94:5;6;5:593736225365464717.5,6)9*:(:&9&9%8%7#7#4-3-4,4*4*5(6)7*c@eDiHkMlPlIjGhGfFfHfIdJdHeKdIcHdHeGeGfEd}C\<_?bB69.:<1??7E@:KB=OE/>/6(/":.7-7,8,9+:)9&8#4*6,8.:0=3@6A7B8;1@6E;FG=@68.6!7&7,3/03,5*9*<'='=%=#;!:87766#8*;1<6=9;;:86:5;6;5:585736226475565616/5,5(9)9)9'8%8%7$7$7$4+4)4*5(6(7&7'8)=12+98lt]nPi=[Jl5\=e4[<`Tq?Oa#(H1+79+-8'18&:;)B=*A<(@>)@B*?GY`4s~Tfwbi~Ub|MaI`C`?a>c@hEjJkMlPnKkHhGgGgIhKfKfJeKeJcHeGfHfGeFcDbBeEhH06*58-;<4A>9G@:KB;RE.?.8(/!6)5)4(6)9+<+=*;(9/9/9/9/:0;1<2=3E;E;B8=3=3A7A7=34#6)5.31/5+6(7)<&9&;&;'<&<%<$:#:!7"7%7-95>:?9:8786:5;6;59585655427376665726/5,5(8*8(9&8&7$7$6#6#6'7(8'9(9(:(:':+;/3.IKo{VjDa=_Ci/[7`=cLlOe0=G >3--3'+8'2=,=B.B@+C;$G="MA'R_*q}Mp|mjW_{J]~E_Ca@b?fCkHlLmQmSoLlIiHhHhJiLhMiMfLdJdGeHfHhIfEeDfFiIlL-3'17-7:3<;6B=9G?UOCZUQa_dhgukklljgbaXVPPQQXY`cfjorux|Ѓֆ׉؊׌،̋ˊ͉ЉшъӉЌϋȍ}xvpScQ\qUT`^RVcOTbH_]DvUBLBRRPWPY\dejljwqvlph~v{~ka?28(;(='='=';':'8(8)8/7.8,9+;+;*:)7(9+7+8,7+7*8*<,>-=0<0<0;/:.8,7+5*@5@5=28.8.;1:06,.$0)2.23/8-9+;+>-?.?0@/@/A.?-?->)9)8*70:6=9=775386:5;6:79585655438485676746/6,5*9*9*9(9&9&8&7$7$9%:&<'=(=(=(>*=.8-;8^eaqPi;\Ai6a/].WIjYq>NX'-?+,730*1)-9-5@/:B+<<"B;VG(iV6vPlwo[aK^F`BcBeBjGoLpPoSoUoLlKiHgGiJiLiNhNfJeIdHfIgIhHgGfFgIiKlN*2%.4*470894<;7B=:HA;KD(>(=(;(;)9)8*3+6-:.:,:)9';)=,>.@2A4=17*4&8)<,:,:,;-;-;-9+6)5(6*;/>2>3?4>37,.#)%-*02290;/>/?0A0@1@2@0=/:-9,8*7/&?'A(A*@,=.71IKgrOdHf7]Am/_1^1XOjWfh39@*,?994443524925>-2<#29ECl`8}RuΗȕ}vbeQ_F`Bc@gDoJrOrRqUpVoLlKhGfFhIiLiNiOgKfJeIfIhIjJiGgEhJkMnP(0#*2'/4-350664<87@<9C>8IE3>0>0@/?.$?%A(@*>-;1:6U\_oGc>b8c6g0c4\CbMaBIL44:97<<>948>58<7379+3="8DS[,PoȈˎ̒Í}{ggQ^E^@c@iDoJsPsSqUoUnMkJgGeEgHhKiNiNfLdIdIgHiJjIiFhEiKlNoQ&.!(0%-2+130333756:97>;6GD=DD*<'8$5#B2OAN@B47)7)>/;+:*8(6'6'6(8*8+;.;/9-5*7,;1<29/7:8=:A8B4A.>,;,:/;19385857483645496;9<69453386;986979899896967465:5:7:7985827/7+8+9+:*;*:*:*:(9(: : =$?%@(@+=.81hCoJrOrRpTnToMkIgFeFfGhKiNiNfKeJdGeHgHhGhGfDjLmOpR(0!'/"(-&+-*.0/333775:94==5?@8DE?JLKQQYVWiZ\s]^|YW[Y^]eennwxڄ䊌솇䂂܀ԂӃҀāǃɄΆ҈Ջ֌ҊNJ~xwpxkeec^XpZMm[Mi\Kf^Kd_IcaHfbGl`FlR;UA^OaYYXPTQ[XbkcYRD<707/;//@/@-=*9'9)0"VJJ?.#=12<07,7->4E;AF8?3:4?2>-;,:2=7@5;687899:98665==<<:<8977767575979899::9;9<9<8<6;5:7:9::9;5907,7+9):):):):);*;)9!>%;#5:$E3@60.^eVgHc;\0X/[5cc?iDnImLlNkQjRjHfDcBcDfGhKgLdJgMhNgKfHeEfEjImJpSrUtW*0")/#).'+-(-/.222553782;<4>@5BC;HJGOPTSUaXYm[[s\Z^]dakjus}Їዋ퍌텄 ڀ~ҀσυƆȇˉ΋ьЍΎɊ{x{stknkd^e\SbaLb`Ke^Kh]Ii\Ij^Hk_Gm_EraG{]C[F[LWPQSPXS`WQKF>9505/908,8*8&8&8&8)7)5,3,2,1'4)9+=-A/@-=*9(9)<.QEH<4(:-:,5&=+=+;*;*:)8)7)6(7*8,7,3)1'1(7.=4BH7>07/:0;.;1<6?6<3632:8EBJFEA?<:9:89796858598988788999:9;9<8=7<5:596888:8:5917-8*:*:*;*;*<+<+<+9"?);$5;'>];2@>/3A05?4E=:X;?T-0X51ZI7bjEu[p||}yr`YuESq?\{B_>b>iCmFlKkMhMhQhFeDcBcDgHiLhNgMiOiMiKgGgGfGjImLnQoRrU-1"-1#,/&,.).0-11/34/45-9;0<>1@B5EH?KMLQRWUTbXWi\Yx^]fcpmzxύᐏ퐎釃~|}ȁ}DžĈƊʌˌˌnj|v{pujpod`i_Ue\MXeK]bKa_Jh[HmZIp[Hq\Go]EtcItZ?V=WDYMTSNTIU@<<984616/6.6+7(6&8&8&8'6)5,3,1,5(6(9)<+@-@-=+8(5'J=E:A57@=C7;AANKZUZURLB>62727474748596;8::7788898;9<8<7<7<38475777:7:48/7,8+:+;+<+<+<+<+<+9$@*9$7$;+2%40OTZiH`8U6V>]FfHfEat?9e?6QA2@C04?.29)>5,O61K*#W:,j\B_t{yv|m\uKHa7Nh9[xB_}?c?hBlEjGhJgLeMeCdCcBeFhIjNkOjNkOkOiMhJgHiHlIpMsVtWvY25$13&02'01+12-23.34.46+9;-;>-?B1DF9IJBNNNRQWTR]XVd\Zoda~nlzwČؑ唑쓏펋扅ڂ{|}Ë}{vzm~sfmoa`k^Vi[NgZJVdJZbJa_JjZJpYIsYJtZIs]FqY?tU9T;ZF\PRNEG:A3/4151505.4+6)8)7$8$8&9'6)5*3,2,8+7)7(:*=->/;-8+3)TK;38.A64'<->-7&8'9(:)8)7)6(3'5*3)2)4,:3>7?9>847596;5;2:397=<@UVc`njidVQA<613/71717182859697::78898;9<8<8<8<8<48686787;7<49/8.9,;,;+<+<+<+;*;*:'@,8&9';-+"54_gSdE];U1B2SE*okHfttqt}l\K_:BV1Lc7Yq?_{@d@iAkDiFgIdJbLcBcBdCgHjMkOmQnRjPjNjLiJgGiGmKqMuYvZx\78(78*66,56056156167/68+;>-=@+@C.DG4IK=NNFQPNSQTVUSYY[a_lkius}Ȍ֕㔐䐍ދӄƁ}|{~zxsznzrfjm_\j[Tk[NjZKjYI^bK_aKe^Kk[KpZLtZKw\Kz[G{WAS=U?XFSFF?76012-3/5/4.2*2'5(9(7$9$:$:'8)7*5,3,>-:)6%8';+=.;.6,80\T=54+A53$:(@-9):*:+:,;-:-8-7-3*1)1+71;7>:;77477;<7=7=69797:::=:=7;2;/9*;*<*<)=)<(<(<(:(=*9':*9-0)AAgrL^E[BYF[N^T]VWSQSU@LN9JG4JE1FD-AA'>C#@G%MU.^g,?=.==1==5=<7;<6;=2;=/?B-@D+CG,GI1KM8NOASPITQLYXDZ[M_^Zgepqo{yƏӏՍъǃ~zzw{uzw|y|~~y|tzrvkqrffm`Zl[QlZNl[KmZKmZIg^Mi]Mi]Mj]Mn]Ms^My^M[I`OWGN@I=@56.0)0*515/4/4-2)3'6&;(9$;$<$<':)9*7,5,A.;(6#5#:)=.;/6->7ZTHA90@36&4 >)7'7'7'7(7)7*7,8-<3:293<7>:=9854196<9::8:>@ORccqpheUP=82+5.;7<::9<3:2:4837365556869697;8<8>7=7=6<8:8;8:;:>:>7<2+>467>O#Jh4gTt\cdfltxpn}\Q`C=J09F,BO3O_;Xi=czDgBkDkDhFeF`G`GfCiFjKlMlOkOmQlRmQmQmPlLkJmJrOuQy]y]x\CB0DB3DB6EB9CC;CC;BB8AD3CG0EH-GJ-JM0OO7RQ?TREURI[\:\\@\]Kaa_ihvrq{z~È{ystpqmolrntqwrwrtoskxrilmb^l_Vj\OlZLn[Lo\Kq\Kq\KrZNq[Nn\Nl_Ol`PqaQy_N[K_SOEA8:25-1(1(5*706/4-3*4(5(6%9#;"<$>$>'<';*9,8,D/<(5!4!9(<.9/5-83NISMB9B5@.2?(;,9+8*6)7+9.;1;3D=A;=;;:8877939584;:JJ\[dcca=9824.81B=E@=;42;3;3928484667777696;6;8<8>7=7=6<686989;9>9>6<1<.8););(;';&;%:'9&?-7%=,:)3'QKkm\fN^I\HWJUSS]RfQjP=Sg{FhClEkDiGcFaG^GiFlImNnOlOjNkOkQpTpSpRoPoNqNvRwUz^z^y]GD3HE6HF9HE613/5/5+7*8)6/4-3,4*6*7'7%7 <">">$?'>'<*:,9,E/='33 8';.9/5./*?;YTI@D7I75D,F7D5A3?2?3B7F9;77464657799>7:473<:IHML=;(%-(5/@9C=A;=8>;?>:2:292849596999:7:6;7<8<8>7=6<7<595878:8<7<4<0:-8(:(;';&:':&:&9%?,4">,:*1&\Xy|T_TbI[DRGOSPbSlS{rSC[C?H3B7%O6"_K0prJiǀyt{qu]oHy}JXy|O\d5:D)3=$4>&WN?XO@YPAZQB\SD]TE]TEcZKbYJbXNcXRg\Zmacsfmwjs|n{~p}ss~p}wjtobli\fcb]a`[a^W_\U_[R^ZOa[ObZMe\Kg\Ji\Ii]Gk\El]Fm]Dm]D_gOkiTqZH{M@RIWLTIWHN:G2?*;(:.7223,17.7.7.8.8.7-6+6+7+7+7+7+8+8+8+8+=.=.8(2!2!;*>/:,6+6-:2B8I>G9;,1!OGIAE=E;H?G@C><:54678:9:7772:3>5KAE;=07)5&8)>.A2;/<2>5=8;97967687>7>7<8:9997:5:35.6/818497989:9:;>9;99<,<*;(:'9&8%F2>//%-(IKkolqWZOPTQVOYP[P]R^V`XMb!:O3JOf xIhrtpakN\lEWdHS\GHN@=C9;<,AB4=?2:=2,:)9,7042226-7.8.8.7-8-7,7+7+7+7+8+8+8+8+9+>/=.9(2 3 :)=.;,:-4*3+;0E:PBRCQAE@@;<6;5>7=89633696879687797=9?:C9?2:,6'5&8)=-@1A4A4@7=8976756686<6<7:89879795:392:3:3;6:8:899999;:=<=?=@;?6<2;-;+<,=+<);(:&8&7%z;)8)5*;5QPce]aMMNLSOYP\R^S^U_V^VSg*Sg(^r3zOlzn`jFau@Sf9IY5FP7?H59?358/;<,AB4=?2:=2;A5:C2@M3Rc?]uCgHqLpJmHkJkLhKmTnToSmQkLjHlHmHpJnJpLsOuTxXxXxZm\bQYH]TE]TE]TE]TE]TE]TE]TE]TE[RC\SD]TE^UF_VG`WHaXIaXIe]He]Jd[Jd[Le[Qf[Uh]Yh\\i]]j^`k_ak__i]]f[YbWU`USYVMWTKTQHRNCQMBSOCWQCXRB^WG^WEaYFc[Fg\Hi^Hk`Jk`J^cOmhUy_PXN[TVQHEE>@7>3<-9*8+9.:/;17-7-7-8.8-7,8,7+7+7+7+8+8+8+9+9+@1>.9(2 3:&=,=.?07+2(3(<0F9M?QB87432052:7>;=<;<8<5:27245697<8=8;-9+6'4%5%8(<+=.D7C6B8=7966455675:6:69797795:3:3:3;4<6<6;8:999889:;<@>A=>7:17+7(;,=+=*<(;(9&8%7$u8%y6%9,E=ROVTOOHHLHSLZO^SbUaW_V]UgxB{UnzzYYp:?R$AS)AQ-?L0:C.6<.690581:;+@A3=?29<1;A59B1@M3Qb>_wEiJsNrLoJmLmNkNpVqUoSnPlKkIlHmIpJpJpLuSxXy[uWqU_NVEOx>aXIaXIaXIaXIaXIaXIaXIaXI_VG`WH`WHaXIbYJcZKd[Ld[Le]Ff^Gf^Ig_Lg^Of\Pf\Rf\Sh]Wh]Wh^Uh^Ug]Se[QdZNdZN]YNZVKVRFRNBPL@PM>RO@UO?WQAYTA[VC^WDaZGd]Jf`JgaKadSleUt]O[Qb\YXDD9:;8:6808-8):*@.C17*7*8+8+8+8*8*8)8)8)8)8)8)9)9)9)A2>.9'4 28"=)@.>/9+6*4*7+;.02614023488;<=?;?6<38/505477764307(6'6&7&7&9':):*A3A4A7?8:78576676:6:68768694:4;492:2:4;7:8989789<:@3B%:F.=F3;A3:=2;<4<=79:*?@2<>19<1:@49B1?L2Pa=`xFjKtOsMqLoNoPmPpTqUpRoPmLlJnJoKqMrNtSyX|]w[mSdJ[LS|DNw?cZKcZKcZKcZKcZKcZKcZKcZKcZKcZKd[Ld[Le\Mf]Nf]Nf]Nf_Eg`Fh`IiaLiaNi`Oh_Ng^OjaRi`Qi`Qh_Nh`Mh`Mh`KiaLb_P^[LYVGTQBPM>NKTQ>VS@YVC\YF^[H^]I`aSf^QmWJ[Rhcb`LM@C:<7974709+>)D+H-7)7)8*9+9+9*9*8)8)8)8)9)9)9)9)9)A2>.:(7"57 >&B-<*;*:,8-8.:.<0>25<3:2736464646155:39385:8:662/,(9(:(:(:(:(:(9&7&:+<-?3?7=8:68687566666748493:3;3:2;2=5=9=:><=;==A6:;3::29:*>?1;=08;09?38A0>K1Pa=ayGkLuPtNrMqPqRoRrSrSrQpOmKmIpLrOtQvSxY{^z_qVdJY?]NVGQzBe\Me\Me\Me\Me\Me\Me\Me\Me\Mf]Nf]Nf]Ng^Og^Oh_Ph_Pg`Fh`IiaJjbMjbMjbOjbOjbOjbOiaNh`Kh`Ih`IhaGibHjcGe`Mb]J^XHXRBSM=MJ9KH7IH6KJ8LK9LM;NO=PQ?QTASVESVEYYM]WKcQEzXNhaeaUUOR=C8>6762:.@+E*I*7(7(8)9*9*9*9*8)8)9)9)9)9)9)9):)@4=/<+:$76<#B*C.@/;,7*2(4+:2@81<2<5=8>:>;>:=9<485:8<;>;<861--'<+=,>*>*=)<(:'8%6%7);.=3<5;7;8;77575758494;4;4=4>5?7A:A;A>A?????B:@8<38-5(5'8(<*;*<)<(:&9'7%6$5#y<)r3!}:*OAYLRGOEVJZN[M[M[O\Q^T`Ya[s}Xy`r|ZU`B9F,/;'0;+1;03=44;35<4:?8?B9?A6<<277+89)>?1:27@/=J0O`HO?HO?PPDVRGYOChREYMULRLXWGJ:A?CBCAC@A>?1256::<;;7734.3+>+>+>+?,>+>(<';'7$7'8+8.8.92<7?;85858494:4;4=4>4A7C9C3:/8+6(7'8):);(=)=*<):'9&7&6%~5$v4$x5%B2UEXKQCPDZLZM[N]O\Q\R\U[V\W`hCX_=JS4>G,6?*2=-4>35?74=88>:=B/;9*78(=>0:26?.=J0N_;`xFkLuPuOsNrQrSpSqMrNqMpLoKrNuRyX`~az]qUfL_G[E\HbRYISzCh_Ph_Ph_Ph_Ph_Ph_Ph_Ph_Pg^Oh_Ph_Ph_Ph_Ph_Pi`Qi`QmcWlbVjaRi`Qh_Pg^Og^Mh_NiaNiaLiaLiaJh`IhaGhaGhaGh`Kg_Je_Ib[H\WCUR?PM:ML:EF4DG6DH7BI9BI9BJ;BJ;BJ;JJ@QQERPAUNYSQOCE8:55:3>/>)<$8'8'9(;*;*;*;*;*:):):):):):):):)=2:.<,>+9#59@':$<)?0;18.7/<5A;;B>FBGCE@?;7501.0,51:5<6:29.9,9,>+>+?,@-@-A+>*=*<(:(7(5)4*80?8D>:5:5;4;4<4=4?4@5C9D:C;A9?:;685739-7*5'6':)<*:)9&=*=+=*<)~:'|7'{6&{6&y1#8*G8REPBK?SE_SXKZN\R]T\V[VYTXSV^7EM(6@8A&>G27@E>GJ?GI;BC1?>);;#78(=>09;.69.8>26?.E5>F7?G8=H8AE4HK6YS;_F0K9j]f`SSDE@@?==5=0>/3$5&6'7(7(8);,=.<-<-<-<-;,;,;,;,3,7.;-;)8"78:"B-<+7)4*6/<7C?HCBGDHCC:661808.5+:/9.8.8-9,:+<+>-=*=*>+?,@-A.B-@-<*:(7(6)6+8-;1=4:4<6?6@7A7A6@4@5G=E;A6;26.3-1,1+;-:,:+:*:);)<+=+~:'|9(|9({:({:(z9'x6&w4$z, A4NCMAL>REVHRG\R\RUMTLZUXSWR`^R[0IQ(AK&BK,>H/7@-2=-4>34;3HPEX^RW[LLO?1;=0:=29?34=,;H.Pa=bzHlMuPsMqLpOrSqTpJqKrLrNsPvU{\bfx^iO_G]G`JfOhRdU[LTyEi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qj^^j_]j_]j_[j_Yj`Wj`Vj`Vj`TjaRjaRjaRjaRjaRjaRjaRj_Kh`Kg_Jg_Jd]J^YEUR?ONE5?E7>F7>F7=E6BF8>E5=F1DN5HK0PB'yS>@=>982:+<-=.<.;-:,9+9+:,:,:,:,:,:,:,:,?9A:A7=/6#2235#7(;0A8E?IDJFJGBCEDC@;59/>1A1?.@1@0>0?/?-?.A.B.;*;*<+=,?+?+?,>+@.=-:,9*8+8-:0:190;2>5A7C7D7D9E8B6A4=1:08-5.5,5.=,=,;,;+:*;*<,=,~;*|;)y:)y:)x9(w8'u6't5&1)C9NCK?J>PDTIRGSJWQUOUR\XWTSO\XT]0Zc8_j@[eBIT66C)4@*0:-;H.Pa=c{IlMuPtNqLqPrSqTqKpLpJqMtQxW|_c{aoUcJ]FaJeNeNcLdU[LTyEi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qj^`j^`j^^j_]j_[j_Yj`Wj`Vj`Vj`Tj`Tj`Tj`Tj`Vj`Vj`VlaMk`LiaLiaNf_La\I[VCTQ@ML:HI9DG6AE6AE6?E7>D6=C5=F57@-?H3EM5AA%QA']Eu`WHbZebRSEFFHBD799+:,:,:,:,8+6)6)8+7+7+7+7+8,8,7,3/5/5-3(0"01 4$A2C7G?KFLGJFFBC?CCDA@:;1=/C1F4G3E3E2C2B0B0B/{B.xD.8*9+:);*<+<+=,<*?.=-;+9*8+9-:/;/7.90;0>3?3@4@3A4:,:,9+7+7+7,8.91=-<,<+;,:+;+<+<,};+z;*z;,w9*v8)u7(t6's5&91FMKB3;I27C-EJ3IG0K<%mN9dO`NA5SLc_^^RUJMDH>C;/9-7+7+9-:/;0;0>4>4>4>4?5?5?5?5?=B>D>F=GN@PDSJOGLGIEFCC?A=@.D2H3J6G4F3D3C1B0zA.wC.uB/8+9+9+:,:,;-;+;+:+:)8)8*9,<-=/>09/8.9/:.:.:,9+8*7)7*7(6*7+8-9/;0=.<-;,9*:+~9*}:*};-|:,z;,y;,w9,s8*q6(q7)q7)B8G=K?HB'=A&;>#78(:;-79,9<1;A57@/MKH/JH1Q?+e>-ZL`S>64+@9XUigdeRUINKQJ@F<@6>4@6D:G=G>JAJAJBJBKCJCKDKDRTSTTPSMSLSLTNUNLHHFEBB@B@B@EBEBJHD@>7>2A2C1F3I6F3D3C3@0@1}?0y@/x@19.9.:.:.;/;-;-;-9*9*9+9,:+;-<.=/;/:/9-:.9,8*8*8*8)8)8(8)9*:,:-;-;-:,9+~9*}8)}7+|8+{9+z8*y9-x:-t9+q5*o5)q7+r:-G;HJY.AR&IZ0Wi?dvLj|TXjDL\8?M,:D)C-=@-:=*89):;-68+8;0H-NC-b=-D:VPMJ++:9=;TPpnwvehY^]cVOOHG@CA=JIB@<6>3@3A2B0D3A2@2>1=1<2<1=1}=1:3;3;1;1<1<1=/=/=/.9)9*:*;+;,;+;,;+:,9+7)~6*{5){5)z6)z6+x6*x8,w9.s7,o5)o5)r:-u=0L>K>JG*SA+{E9NLEH5<19@E?@JIb`rpopbeZ^RJLDD=B;D=E>CC?C?D@EAEA?D@DDFFHIHJIIIFHACADAEACAA@>>:=8EG=<73;4@4?1>0A1=/<0;1928193:4;4:4:4<3<3<3}=3}=3|<0{=0{=0{=.{<-z;,y:+z8*z8*:0:.:-:.:.;.<.=-9):):*;*;+;,<+}<*8,8,~6*}5)|4(z4(z4*y5*u3'v6,v8-r6+n4(n5*s:/v@4PBN?N=R@VFXIUJRINIRPSO\VfZl\LML7BL3@O.KZ9WgC`rJezOdzLVl=G]/AV+7I#0A!5C*=F5QJ:MG7IC3GA13M*>G*[B.PGVV7?'3BN:C9>;:HG][gf[]ILJDF@C=C>GBGBB>=9C?B?C@DADBECECFD>C?DBEEGGGFFBC=AAD>C;A<>>>A?D@FA@C7830:4?4>1=/?2;.9.8061717384:5:3:3:3~;3|<3|<2{=2{=2u9.v;-w<.w<.x=-x=-y;,y;,{;1};/~8,7*6)5'6(5&7(8(:);)<+<,~=+{<*8,7+~6*|4(|4({2)y3)y5*t1(u5+v8-r6+n4)n5*t;0xB6TEQ@P>UBYHYISGNGSNRPPKVObUeZHFK4;K0IX;[jKgxVewQYnCSi;Me5I`28M"-B*;2@):E7;B;8<;7;<<=-<=/79,9<1=C77@/6C)DU1Rj8_{@mHpJqLrQtUrUqQtVuYsYmSdN\HZDdNaJ`HcIfJiIeDa>`PWyGPr@i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTo\Nq_QtdUrdWnbTj`Th`ShbTgaSebQa^K[VBVQ;TN6NH.GA'RD)N=#cI2iVzmng[WPQBE@E@GBFDGEIGIGIBEBEBDEEDBC;D:H;F7H9H:G?EBBD?F=EBDBDBDDEDEEDEDEDDAC@B?@>?=?=?=@>E??8:280:0>4@3?2A4|@5}?4<3:3837372<-<-<-;,;-:,:,:,9-9-9-~:/~:/~:/~:/~:/~80~80}90}90}90}90|90|90|90|90z:0y9/y9/x8.w9.w9.w8/w8/v7.t8.s7-r6,q5+p6+l2'q7,m4)l3(o6+m4)q8-H=ULTLQKPJNJNLNMPLSMUK\NdOkaFTW8JX5N_;gT`zMWpFTkARg@O`0CA4B@4@<12:/2:/4:.5;-9=.A,>D*T^4E9F9G=G>GDCEAE?GCDCDCDDEDEFDFDFDEAC@B?A>A=A=@=A>FAB<=6:090;/=0=0A4|@5}?4<3:3917172<-<-;,;,;-:,:,:,9-9-9-~:/~:/~:/~:/~:/}90}90}90}90}90}90|90|90|90z:0z:0y9/y9/x:/w9.w9.w8/w8/t8.s7-r6,r6,p6+p6+k1&q7,m4)l3(o6+l3(p7,~H2><03;03;05;/6<09=/A,>D*Q[9^mDmPpRrSqRsSsRxa|exakT`I]F]F\E`IaJcLeNdMbK`I^G]MRtBIk9i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTtbTo_Pm]Pm_ToeYog\keYhbVfbVpl`{xi~{jzgzuapiVf`JPVG@GCFFEFDGCDCDCDCDDEECECECDBE@D?C>C=C=B=B=F@E=C:>5:/8-9,<-A2~@3}?2=1:1918180<-;,;,;,:,:,:,:.9-9-9-~:/~:/~:/~:/~:/}90}90}90}90|90{8/{8/{8/{;1{;1z:0y;0x:/x:/x:/x:/t8.t8.s7-s7-r6,q5+o5*o5*k1&o6+m4)k2'n5*i3'm7+}G;QIPIQJQLRMRNTPUPVO[P^OtbNoiQnrWjwYfwWPf@K_:EY6BV3EV6GV7FU8ER8?I1*7;*:<.<>0<=/:;-5<45<46<26<09=/<>0=@-=C)MV7Zi@h|KlNpOqRuStSzcw`nWcL\E\E\EZC_HaJbKdMcLaJ_H]F[}KPr@Gi7i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTtdWqaTm_Rk_SkaWlcZle[jf]jf]wuiy|rygZfNLV>AI2CF1ED0D?,I=-TD5M:+O8*R6*T7)X8+];/a?3eA5KASLUQNKEDABCCEF?>@=B>D@EAFDEDEDCDCDDDDDDDEDEBGCFBE?E>E>D=D=E=E=C@8;/8,9+;.@2@1~?0=/;/:/9/90;,;,;-:,:,:,9+9-9-9-~:/~:/~:/~:/~:/~:/}90|90|90{8/{8/{8/y9/x8.{;1y;0y;0y;0x:/x:/v:/v:/s7-s7-s7-r6,p6+o5*o5*n4)j1&o6+l3(h2&k5)h2&l6*|F:OGPHQIRMSNUPWPYQ]RaUy_PiZGd_IciOZgKN]@EU8AQ4=M0G2:A/7>,9=,9=.8<-7;,6=66=66;46<29<1;=/dxGjLpOsTwUwT{dr[eN\EZC\E\EZC_H`IaJbKaJ`I^G]FY{INp>Ef7i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTseXugZsg[mcYjaXle]snhzwp~wv~i`hSLSADK9AJ7>G4>G4BI7GNB?@AAC@EAEAEAEADFDFDFDDEDEDEDEAFBFAF>E=F=F=F=G>@9B;D=B9>3:-;.=/?0?/~?0=/<-:-:-:.;-;-:,:,:,9+9-9-9-~:/~:/~:/~:/}:1}:1}:1|90|90|90{8/y9/x8.x8.v8-y;0y;0x:/v:/v:/u9.u9.u9.s7/r6.q6.p5-o4,n3+m4+m4+j1(o6-j4*h2(j4*g1'k5+zF;MGNHPJSLUOWPZPZQ{YMv\OkZJ]UBYXDY^HOYA>L3;G18D.5A+5A+8D.=I3AM7EN;BK8?H5.5<,4;+5;75<56;56;48;2:-;@)GP1Ra:buGiKqPuVyWxUzcnW`IZ}C[~D^G^G]F`IaJbKbKaJ`I_H^GW{KLp@Bf6haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTmaUndXpf\lcZkd\rmg|ľtfcTPQAEI8=F38E18G45F35F44E36D58D6;E:?G<@H=<6(L0=/=.>/?/>.=-<-;,;,;-:,:,:,:,9+9-9-~8,~:/~:/~:/~:/}:1}:1}:1}:1z:1z:1y90y90x8/v7.v7.v7.u9/u9/u9/s9.s9.s9.r8-r8-q6.q6.p5-o4,n3+m4+l3*l3*h2(l6,i3)f2'h4)e1&i5*xD9KEMFPJTLVOXNYO|\Os\Nk[L_XFUTBPS@JQ?@I64@,3<+2;*09(09(2;*5>-9B1-;@*CL/O^7_rDiMrSwXyWvUs\fOZ}CX{A\E]F]F^G`I`I`I`I`I_H^G]FVzLJn@Ae7haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTiaVjbWkdZmf^upjҺzym__YIKL:>F19E1>2J91`94HH\__dVZOSMOLKJJHEFBDAA?DFDFDFCECEBBCBCBDCD@E?F?F8?:B9C:C8A4<-9)>->.>-=,=,<,;,<-:,:,:,9+9-9-~8,}9.~:/~:/~:/}:1}:1}:1}:1}:1y:1y:1x90x90w8/t8.s7-s7-s9.s9.r8-r8-q8-p7,p7,p7,p5-o6-n5,n5,m4+l3*i3)i3)g1'k7,h4)e1&h4)d0%f4)uC8JELHPJTLWNYOx[Mp]Nj^N]WGPQAKN=CJ:9B12:+08)36-17-06,/5+/5)17+2:-4<-9D4;F6=H7*0640641622716929;0:<.:?)?H+KY5]pChLsTwYwWrQiT^IUx@WzB[~F[~F[~F]H_J_J_J_J^I^I]H]HUvKJk@@a6haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcToh^ng_lh_tqjũsbaZGML7CH2AI4AH6BF7BD7C@9D<9C98C772?5;@9@93H/+c76QRgimm[\YWUSQNKKGFBB@ACGDFDFBEBEADBBBBDCCBC?C>E>E>F-=,=,<,<*=+:,:,:.9-9-~8,}9.}9.~:/~:/}:1}:1}:1}:1}:1{;2w;1w;1v:0u9/t8.s9.r8-q7,r8-q8-p7,p7,n8,m7+m7+m7+o6-o6-n5,m4+j4*j4*i3)h4)f2'k7,h4)c1&e3(b0%e3(uC8JGNIQJTMXOzZMq[Mh\LXUDHK:=D4=E69A208+/7*5=056157257247005.06,08-19,6A3:E5=J9>K9;J77F12A,0?*.42.420511605818:/:<.:?+WzB[~FY|DY|D\G_J_J^I^I^I]H]H]HSsJHh?>^5icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUmdUmdUmdUmdUmdUfc\gd]vsnȷɴicbFGG-EG/DF0GD3IC5H;3F42G34M797@;;@:@;8G85cGFkjŔ譩ҋtn]XSNNNIKEICGFHHKCF:>>@FIDG:;@@@@A@B>C>B.>/?.>-=,<+=*=*9-9-9-~8,~8,|8-|8-|8-}9.|90|90|90z:1z:1z:1z:1x=5w<4v;3u:2t91r7/p7.p7.o6-m7-m7-m7-m7-l8-l8-l8-i2+m6/p92o81k4-g2*g2*h3+e0(i7.d2)^,#`0&_/%b2(p@6LJOKQJQJ}YMv_QfYIRO>CF5=F58C35@02=/3;04:04:077577566446135016/05..6+.9+2=/6C29H5:I68G42D./A+,20,2.-2..3-36/780:&DR1YkChRu[w_rWjN\}HXyDTu@Tu@WxCZ{F[|GZ{F^JbNbN^J\}H_K`L^JTrNFd@:X4icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUmdUmdUmdUmdUmdUed_onjͱcgkJMP1II/EC,HA/J>2L93M85Q99;;9BA?MHE\RQyjg̳ǿ괪̃|c\VTPSFM=DEEEEGHIKEG<><>@C>???@@A@B>B=A/>.>-=,<+=,<,9-9-9-~8,}9.|8-|8-|8-|90|90|90z:1z:1{;2{;2{;2v=4u<3t;2s:1r90p7.m7-m7-m7-l8-l8-l8-l8-j8-j8-j8-l5.n70n91n91l7/i4,g2*e3*c1(e3*_/%^.$b2(^.$`0&n?5IEQLWRWOrVKdRDQJ:>?/:A16A14A02>02<14<15;17:388677577557446116005./7,.8-1<.4A07E49H58G44E22D.062.40.3--2,14-45-8:-9=,7?'DQ3YkEhSv`wbpYfNZzHWwETtBTtBVvDYyGYyGYyG[{I_M_M\|J[{I^~L^~L\|JTmOF_A9R4icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUmdUmdUneVneVneVddby{xشĝj`hCRW7DG,EC.KD4MC9N?8L=8C:;SJKi`axv画ecACBINVVRLIDABAFEEFCDBD=?>>??@?A@A=B=A/>.=-<+=,=,9-9-9-}9.}9.|8-|8-{8/}:1}:1{;2{;2{;2{;2{;2{;2t;2s:1p:0o9/n8.m7-k7,k7,l8-l8-j8-j8-j8-j8-i9-i9-n91m80m80m80m80i7.f4+c1(c3)a1']-#_0&c4*\-#_0&sD:OKUPXQqSK^J?OC7?<-37(2:+/<+0<.2=/4<15;17:37:388688668557257227016/08-.8-0;-2?.6C27E48G48G48G46=53:2/4-,1*.1(13(57*6:)6>'DQ5[lHkZyfwflX^KWwEUuCRr@Rr@TtBVvDWwEWwEXxF[{I]}K[{I[{I]}K\|JXxFPfOAW@3I2icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUneVneVneVneVofWgkl۲™}cdnKLS4EI0HJ5KI:GE9D@7QEEk__莎bd>CPITMOJF@FBMJJI??>>>??>@?A?B?B?C?>8?:C=E?E>B9=5;2<1=0=1=0=-~<,=-=-~:/~:/~:/}9.}9.|8-{8/{8/~;2|<3|<3{;2{;2z;4z;4z;4p:0o9/o9/m9.l8-k7,j6+h6+i7,i7,h8,h8,h8,h8,h8,h8,o:4j81h6/i70j81j81e4-a0)e4-b1*].&a2*b3+Y*"_3*zNE~]XvWRiNGWC:J<3@:.:;-8<.08)/:,1<.2=/5=25;169078079468368349338138119.19..9+/:,1<.2?.5B18E4:I6;J7;C87?428.-3)-0%/1&24'48)4<'ER8_pPrd}nwifXT}EUrBTqASp@Sp@TqAUrBVsCVsCWtD[xH]zJ\yI^{K_|L\yIVsCK\JD8f\Z|z즤ifK=QDYN[QQHD=A@?B>C?C?C?C?>9@5<4<3=2=1=0=/~<.=/Qn>Qn>Qn>Qn>Qn>Sp@Sp@WtD[xH]zJ]zJ_|L_|LZwGQn>ESF6D7(6)gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUneVneVofWpgXpgXpgXinrz׹ĥregOMP;EL:EM>EODGSG~zqƽߑ}fSK:UFWKF;@8KEC>C?B?C@C>D>D>C=@6:6-85,99/8:/47,36+4:.5;/5;/69.69.68-57,46+19,19,19,19,19,19,19,19,08+.9+.9+/:*0;+3>.6A17B2gw]umvnf_RwKAh;Mj:Nk;Pm=Pm=Nk;Nk;OlVsCZwG]zJ^{K_|L_|LVsCLi9=H@/:2#.&gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUneVneVofWpgXqhYqhYcjpmtzƯ}vn[ZWFOQCQWKYcZbmeq[WDSCQBMAJAG@E?E@E@E>D=Ce9Jg9Li;Nk=Nk=Li;Li;Mj
      UrDYvH[xJ]zL^{M\yKQn@Eb47@;+4/!*%gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUneVofWpgXpgXqhYriZhowmt|ʹƯsce]P[YM_bYovo|Ȱ}gO=Q@RDC8IAH@F@F@E=D6qB:n?7pD;g;2g;2SJaXTKpE<6=52913:27<5492/5+25,9<345-35*24)13(13(35(46)57*,7',7'-8(-8(-8(-8(-8(/7(19*08)08+/7*/7*/7*08+08+7@+9B-=D2=D2=A29;-35'/3$3:*JVBcr[f}a\wVLnICgA=c:He7Kh:Nk=Nk=Kh:Jg9Li;Nk=TqCWtFZwI[xJ]zLZwINk=A^05;9*0.!'%heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVhdYkd\kd\md]meZmfVg`MjeOnlWnl]ff^eeeqqyֵymvW\fK`lTq~lЪa\D=MEKBC:A7D:H>JAI>G>J2K4L5K4H2F2E3E5D5C6@4>3;29/7/6-~:1~:1}90|8/{7.z7.y6-x5,w7-w7-x8.x8.v8-u7,s5*q3(h91h91h91g80h70g6/g6/g6/f5.h6/i70j81i70h6/f4-g2,k1-k4/n70m80k9.j:.i>.iB1dC2gJ8aJ8raOyn\|jqOL;4:04:04:039/39/39/28.28.17-17-17-06,06,/5+/5+/5+/4./4./4./4./4./4./4./4.05//4./4..3-.3-/4./4.05/0;32=55A77C98D86B64@22?.3@.DQ=WeN\jSSaHHV=DR8FT:Ic>Ke@Ke@Ke>JeOjAUpGYtK\vO]wR]wTWpPHaC8Q3).2&+/$)-heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVhdYkd\kd\md]meZmfVjcPlgQmkVlj[gg_lll~~ЯvkrSYaI_kUto}uJ@K@JJ>D9=2?6D;H3J7M9J7G5C4D6F7C7C8A7>5<4:19181}:2}:2|91z:1y90x8/w7.v7.u6-v7.t8.t8.t8.r6,p4*o3)i81i81i81h70h70h70g6/g6/e3,e3,g5.h6/j81j81j81k92k60l71m80l:1k;/l>1j@0iD2hG6kP=gR?ufSvdsrML:4:039/39/39/28.28.28.17-17-17-17-06,06,/5+/5+/5+/4./4./4./4./4./4./4./4.05//4..3-.3-.3-.3-/4.05/-80/:21=34@66B66B66B45B16C1CPAO6BP7FT:Ic@Jd?Ke@Ke>Ic3L/).2',0$)-heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVhdYkd\kd\md]meZmfVmhTmhRmkVjk[jkcvxwۿʫyuy^kpZt{iٞL=Q@K;>1G9XMTJ?6D6H9J=I=B7?5A7E=A9A9@:>8~>5<4<4;4x<2x<2w;1w;1v:0u9/t:/t:/s9.r9.r9.r9.q8-n8,l6*k5)j81j81j81j81i70i70i70h6/g5.g5.g5.g6/h70i81k:3k:3l;4k:3i:0j;1k?2lB4iD2fE2fI7lVAjYEviVl{mEF439/28.28.28.17-17-17-06,17-17-17-06,06,/5+/5+/5+/4./4./4./4./4./4./4./4./4./4..3--2,-2,.3-/4./4.*5-+6.-9//;12>24@46B47D38E3?L:ER>CQ:;I28F->L3ES:H`>Jb@LdBKc?Ia=G`9F_8G`9RkDXpL]uS^vVZqTPgK=T8,C)).2',0%*.heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVjcYkd\kd\md]meZmfVniUljSlkVlm]pqiؼǫ}ſınQ>P=XHL?D7G<>4D;H?F>?9;6=8A>?;@<@<}@;z?9y@9x?8v?8v=4v=4v=4u<3s=3r<2r<2q;1o;0o;0o;0l:/k9.j8-j8-i7,n72n72m61l71l71k60i70i70l:3j92h70g6/f7/f7/h91h91j?6f>4e=1f>2hC3iE5gF3cG2cJ6hV@k\GskVnzor_9>*28.28.17-17-17-06,06,06,17-17-17-06,06,/5+/5+/5+.3-.3-.3-.3-.3-.3-.3-.3-.3-.3--2,-2,-2,-2,.3-.3-)4,)4,*6,+7-.:01=14@25A36C2:G5=7A;D?C?<;989:====>>@?|A=xA6s>6s>6r=5p>5p>5p>5n>4n>4m=3l<2j;1j;1i:0i:0i:0p62p62p62o51m61m61k60i70l;4k:3h91e90e90e90e:1f;2dB6cA5cC4dD5fG5eH6cH3_I2^L6eV?jbKrmWnr[`L3;&28.28.17-17-17-06,06,06,17-17-17-06,06,/5+/5+/5+.3-.3-.3-.3-.3-.3-.3-.3--2,-2,,1+,1+,1+,1+-2,-2,,6.+5-*4,*4++5,.8-0:/2=/2=-5@06A05A-1=)1=)5A+9E/=O5AS9FY=I\@J]?J]=K^>L_?TgG\oQcvZbtZYkSK]G6G4$5"&+.$),"'*heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVjcYkd\lc\md]meZlfVlgSljSlnXorasvmθͺƶø̧lXZGVCM;A8BD??>;;99:;<<>??=}@=wB7o>7n?7o@8n?7m>6i=4h<3h<3h<3i=4r73q62q62p62o51m61l71j81h70g80e90e:1d<2f>4f@5gA6]C4aG8cL:dM;cM8`K6]K3]M4]Q9`Y?miPss[mt|eFO:2>(39/28.28.28.17-17-17-06,17-17-17-06,06,/5+/5+/5+-2,-2,-2,-2,-2,-2,-2,-2,-2,,1++0*+0*+0*+0*,1+-2,,6.,6.*4,*4+*4++5*-7,.9+-8*0;+4?/5@/4?.3>-3?+4@,7F/;J3@P6DT:GWH=H>G@F@C@=:97<;=;>;A5i=4j>5j>5k?6s63r73q62p62n72l71j81i81d8/d90c;1d>3d@4cA5cA5bB5VG4^OmmSsw^zjcmU2>(5C,4:039/39/39/28.28.28.17-17-17-17-06,06,/5+/5+/5+-2,-2,-2,-2,-2,-2,-2,-2,,1+,1++0**/)*/)+0*,1+,1++5-+5-*4,*4,+5,+5,,6+-7,,7)/:,2=/6A17B27B25@/4?.2?+5B.:G3>L5AO6ES:JX?M[BTbI]kTcqZ_lXUbPERA2>0#/#(..&,,$**heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVjdTjdVjcYkd\lc\md]lfZlfVomXmmUimVgkZembr{x׭sYSAQ?N>O?OBJ@C:<4<7>8?6@7{B7tD6qE8nG8s>:s>:s>:q>:q>:q>:q>:p?:sB=rA8l=7l=7m>8n?9r73r73q73n72m82j81i81f:1f;2d>3d@4bB5`C5]A3\@2[?1QI4[S>f^Gg_H`Y?ZS9ZS7\W:ZV;WW;knSrx^u}eUaI%37E.4:04:04:039/39/39/28.28.17-17-17-06,06,/5+/5+/5+-2,-2,-2,-2,-2,-2,-2,-2,,1++0*+0**/)*/)+0*+0*,1+)3+)3+*4,+5-+5,,6--7.-7,,6+.8-2=/6A39D69D67B46A1/<*2?-5B09F2:u@:s@9o>9o>9n72n72n93m;4l;4j;3g<3d<2c?3^>1dG9cG9T=-O8(M8'D/TR;PN7KI0MK2]Y>ieJeaDVU7XX<]`CosXzfcmT=I1,:#1?(5;15;14:04:04:039/39/39/39/39/39/28.17-17-17-06,16016005/05//4./4./4./4.,1+,1+,1+,1+,1+,1++0*+0*.5.-4--4-,3,-4--4-.5-.5-+2*-4,08-5=29A6=E:?G7B25@03>-1<+2>*9E/BN8IU?O[EVbN]hWYdTLWIF5F4D4D2}B0yB.s@-o?+v?:t=8u>9v?:t?9q<6r=7sA:q?8q?8q?8o>7o>7n=6n=6n=6l;4m<5m>6k?6j?6h@6eA5cA5dG9[A2^G7\I8N=+F7$G8%A4!IM4GK2DG,BE*MM1[[?abC`aBYY=dgJsw\sy_X`H8D,/;%6D-7=36<26<26<25;15;15;15;15;15;15;14:04:039/39/39/27127127116016016005/05/.3-.3--2,-2,,1+,1++0*+0**1**1*)0))0))0)*1*+2+,3,.5--4,.5-07/4;39@8?F>BIA:G69F56C13@.2?+5B.;I2?M6KXDR_KXeSVcRKWI8p;5q<6vA;sA:p>7r@9xG@n=6n=6n=6m>6l=5l=5l=5l=5g?5h@6gA6gC7eC7cC6`C5^D5aL;UB1ZI7`S@RG3C;&E=(GA+>G,BH.@F*<@%?B%LO2_`AijKaaEnqTvz_gmSHP84<%4=(=F18>48>48>48>47=37=37=36<28>48>47=37=37=36<26<26<25:449349349338238238227105/05//4..3--2,,1++0*+0*(/((/((/((/((/()0)*1*+2+070.5.+2++2+.5.5<5K:4-9/-3/-3/,2.gdUgdUheVheVheVheVifWifWifWifWifWifWifWifWifWifWleUldWlcZmd]md]mf^mg[khWmlWimThpXht`hthm|wڻּҽzyS3i?3i?3i?3f>2f>2f>2f>2aA4`C5`C5_C5^D5[D4ZE4VE3XI6OB/\T?oiSc^HMK4IG0LJ3;E*?H->G*48>47=37=37=39?58>48>48>48>48>48>48>47<67<67<66;56;56;55:45:438238216005//4.-2,,1+,1++0,+0,*/+*/++0,,1--2.-2.051.3/+0,+0,-2.2738=9'4.:0.5..5.-4-gdUgdUgdUheVheVifWifWifWifWifWifWifWifWifWifWifWleUldWlcZmd]md]mf^mg[khWkmWjnUiqYgs_drejytܽչѷѾӾϴu`yVBlI5mH6rM;uP>mF7iB3gB2jE5nI9oJ:pK;oK;eA1eA1cB1cB1cB1cB1cB1bC1\G6\G6\G6ZG6YH6WH5TG4RG3PH3MH2fdM~~fprZVX@IM4HL3;E*A.;>+9?59?59?58>48>47=37=37=38>48>48>48>48>48>48>48>49>89>89>88=78=78=77<67<66;55:449338227105//4./4.-2.-2.,1-+0,+0,,1--2.-2.,1-,1-,1-,1-.21043376598:H7=L9@O<@O:8F91?2,9/.5.-4-,3,fcTfcTgdUheVheVifWjgXjgXifWifWifWifWifWifWifWifWleUldWlcZmd]md]mf^mg[khWkmWioUiqYgs_bpcgxrڻѵ˴˺ӿһurd|]I}^JrVAaE0W;&Y=(Z?*X=(`E0`E0_F0_F0`G1`G1^H1^H1[L9ZM:ZM:XM9XM9UM8RL6QL6NL5QQ9ikS|glrXSY?DM2>G,:G+48>48>48>47=37=38>48>48>48>49?59?5:?9:?9:?9:?99>89>89>88=78=78=77<66;55:4493382382/40.3/-2.,1-+0,+0,+0,+0,+/.,0/-10.21/32/32/32.210A.5F3;M7>P:=O7:L47I/6H.3E-6H0:L6MJ9EB1;A7;A7;A7;A7:@6:@6:@69?58>48>48>49?59?5:@6:@6:@6;@:;@:;@::?9:?99>89>89>8:?9:?99>89>88=78=77<67<6495273162/40-2.,1-+0,+/.,0/,0/-10.21.21.23-12,01):'/@-6H2;M5=O7?I.9F*?L0=J.AN2DN3HQ4LR6IN0JM0ZY;miLhdIc]C_YA_ZD`[GZUBQN=LI8=C9=C9=C989>89>8;@:;@:;@:;@::?9:?9:?9:?99>:8=95:6384162/40.3/.21.21.21-10-12,01,01-12-12$5"*<&3E/9K3XW9UT6SR3KE/JD.FA-D?,A>/@>1??3>@5<=5;>59?59A67B48C57C57D3:B79A69A68@58@59A69A6:B7:B7:B79A6:B7;C8F;7B:7C97A66A16?.4<-39-270.5./51-7/-9+-<%.B3J7O7Z 8Y$8W+:U2:R8;P==O?>O=:L6@R8EX:EZ;DY:>U93J0(>'.5-,3++2*ZgM[hN\hP_iQakSckTglXhkXghVihVifWifWkeWmeXmeZnf[khWkhYkg[kg^jf]jf]hfZgeVgjWglVfoZerajwnz̹˾NjlRM0TM0QK+SJ+WN/UO/UN1TO1SO2QP4QP4PP6QM2PO3PN5PP6MO7KO6HM6EM5HQ6EN3BK.AH)BI(GM+JP,KQ-NR/PT1VZ9^aBaaE[[?VVVV>XV=YW>XW;XW9WV8VU7QK5OI3LG3ID1DA2B@3??3>@5<=5;>59?59A67B48C57C57D3:B79A69A68@58@59A69A6:B7:B7:B7:B7:B7;C8F;76<83=51=/3B+9M*BY-Ia1Nq7Mn9Ji=Fa>AY?:L<:K9=O9DV5:@69A67B47B47C57D3:B7:B79A69A69A69A6:B7:B7:B7:B7:B7:B7;C8F;>F;>IA>J@?I>>I9?H7>F7>D8=B;>E>;A=6@85A39H1BV3Pg;ZrB]F\}HVuIMhEBZ@9N;5G74E3XR6F;?G<>H=>I9?H7>F7>D8=B;=D=;A=6@85A39H1DX5Ri=]uEY|BXyDRqEIdA,6H2@R8L_AQfGShIMdH@W=4J329107/-4,YgMZhN\hP^jRblTemVgoZjo[lo\lm[mk\mj[nhZnhZoi]ph]liXkhYjfZie\ie\ie\ig[igXfiVchRajUerao|s{ѿɶıþ˾Ÿ̌oRL2UN2TM0WN1VM.UO/WP3VQ3UQ4QP2ON2MM1PL1NM1NL3MM3LN6LP7KP9JR:LU:IR7JS6QX9SZ9U[9]c?gmIasxpr|Z\bFLP7KM7LK6KI4NI5PK7TM:VP:WQ;VP:SN:QL9LI:IG:EE9CE:=>6F;?G<=G<=H8>G6=E6=C7=B;:A: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 UV9?7uwJ&e$(diH-;xA|a1JT3r4gdfE literal 0 HcmV?d00001 diff --git a/jpeg-8c/testorig.jpg b/jpeg-8c/testorig.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9816a0c6231a7c5eaafd445368a9eeb1cffc63df GIT binary patch literal 5770 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 literal 0 HcmV?d00001 diff --git a/jpeg-8c/testprog.jpg b/jpeg-8c/testprog.jpg new file mode 100644 index 0000000000000000000000000000000000000000..920fee2e32b5a8ab0af796e010ee8a1add3eee63 GIT binary patch literal 5655 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 U9#E?5!l?r;*e8trGk!h)KW4JmQUCw| literal 0 HcmV?d00001 diff --git a/jpeg-8c/transupp.c b/jpeg-8c/transupp.c new file mode 100644 index 00000000..40605448 --- /dev/null +++ b/jpeg-8c/transupp.c @@ -0,0 +1,1583 @@ +/* + * transupp.c + * + * Copyright (C) 1997-2009, Thomas G. Lane, Guido Vollbeding. + * 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 image transformation routines and other utility code + * used by the jpegtran sample application. These are NOT part of the core + * JPEG library. But we keep these routines separate from jpegtran.c to + * ease the task of maintaining jpegtran-like programs that have other user + * interfaces. + */ + +/* Although this file really shouldn't have access to the library internals, + * it's helpful to let it call jround_up() and jcopy_block_row(). + */ +#define JPEG_INTERNALS + +#include "jinclude.h" +#include "jpeglib.h" +#include "transupp.h" /* My own external interface */ +#include /* to declare isdigit() */ + + +#if TRANSFORMS_SUPPORTED + +/* + * Lossless image transformation routines. These routines work on DCT + * coefficient arrays and thus do not require any lossy decompression + * or recompression of the image. + * Thanks to Guido Vollbeding for the initial design and code of this feature, + * and to Ben Jackson for introducing the cropping feature. + * + * Horizontal flipping is done in-place, using a single top-to-bottom + * pass through the virtual source array. It will thus be much the + * fastest option for images larger than main memory. + * + * The other routines require a set of destination virtual arrays, so they + * need twice as much memory as jpegtran normally does. The destination + * arrays are always written in normal scan order (top to bottom) because + * the virtual array manager expects this. The source arrays will be scanned + * in the corresponding order, which means multiple passes through the source + * arrays for most of the transforms. That could result in much thrashing + * if the image is larger than main memory. + * + * If cropping or trimming is involved, the destination arrays may be smaller + * than the source arrays. Note it is not possible to do horizontal flip + * in-place when a nonzero Y crop offset is specified, since we'd have to move + * data from one block row to another but the virtual array manager doesn't + * guarantee we can touch more than one row at a time. So in that case, + * we have to use a separate destination array. + * + * Some notes about the operating environment of the individual transform + * routines: + * 1. Both the source and destination virtual arrays are allocated from the + * source JPEG object, and therefore should be manipulated by calling the + * source's memory manager. + * 2. The destination's component count should be used. It may be smaller + * than the source's when forcing to grayscale. + * 3. Likewise the destination's sampling factors should be used. When + * forcing to grayscale the destination's sampling factors will be all 1, + * and we may as well take that as the effective iMCU size. + * 4. When "trim" is in effect, the destination's dimensions will be the + * trimmed values but the source's will be untrimmed. + * 5. When "crop" is in effect, the destination's dimensions will be the + * cropped values but the source's will be uncropped. Each transform + * routine is responsible for picking up source data starting at the + * correct X and Y offset for the crop region. (The X and Y offsets + * passed to the transform routines are measured in iMCU blocks of the + * destination.) + * 6. All the routines assume that the source and destination buffers are + * padded out to a full iMCU boundary. This is true, although for the + * source buffer it is an undocumented property of jdcoefct.c. + */ + + +LOCAL(void) +do_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, + jvirt_barray_ptr *src_coef_arrays, + jvirt_barray_ptr *dst_coef_arrays) +/* Crop. This is only used when no rotate/flip is requested with the crop. */ +{ + JDIMENSION dst_blk_y, x_crop_blocks, y_crop_blocks; + int ci, offset_y; + JBLOCKARRAY src_buffer, dst_buffer; + jpeg_component_info *compptr; + + /* We simply have to copy the right amount of data (the destination's + * image size) starting at the given X and Y offsets in the source. + */ + for (ci = 0; ci < dstinfo->num_components; ci++) { + compptr = dstinfo->comp_info + ci; + x_crop_blocks = x_crop_offset * compptr->h_samp_factor; + y_crop_blocks = y_crop_offset * compptr->v_samp_factor; + for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; + dst_blk_y += compptr->v_samp_factor) { + dst_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, + (JDIMENSION) compptr->v_samp_factor, TRUE); + src_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, src_coef_arrays[ci], + dst_blk_y + y_crop_blocks, + (JDIMENSION) compptr->v_samp_factor, FALSE); + for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { + jcopy_block_row(src_buffer[offset_y] + x_crop_blocks, + dst_buffer[offset_y], + compptr->width_in_blocks); + } + } + } +} + + +LOCAL(void) +do_flip_h_no_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + JDIMENSION x_crop_offset, + jvirt_barray_ptr *src_coef_arrays) +/* Horizontal flip; done in-place, so no separate dest array is required. + * NB: this only works when y_crop_offset is zero. + */ +{ + JDIMENSION MCU_cols, comp_width, blk_x, blk_y, x_crop_blocks; + int ci, k, offset_y; + JBLOCKARRAY buffer; + JCOEFPTR ptr1, ptr2; + JCOEF temp1, temp2; + jpeg_component_info *compptr; + + /* Horizontal mirroring of DCT blocks is accomplished by swapping + * pairs of blocks in-place. Within a DCT block, we perform horizontal + * mirroring by changing the signs of odd-numbered columns. + * Partial iMCUs at the right edge are left untouched. + */ + MCU_cols = srcinfo->output_width / + (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); + + for (ci = 0; ci < dstinfo->num_components; ci++) { + compptr = dstinfo->comp_info + ci; + comp_width = MCU_cols * compptr->h_samp_factor; + x_crop_blocks = x_crop_offset * compptr->h_samp_factor; + for (blk_y = 0; blk_y < compptr->height_in_blocks; + blk_y += compptr->v_samp_factor) { + buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, src_coef_arrays[ci], blk_y, + (JDIMENSION) compptr->v_samp_factor, TRUE); + for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { + /* Do the mirroring */ + for (blk_x = 0; blk_x * 2 < comp_width; blk_x++) { + ptr1 = buffer[offset_y][blk_x]; + ptr2 = buffer[offset_y][comp_width - blk_x - 1]; + /* this unrolled loop doesn't need to know which row it's on... */ + for (k = 0; k < DCTSIZE2; k += 2) { + temp1 = *ptr1; /* swap even column */ + temp2 = *ptr2; + *ptr1++ = temp2; + *ptr2++ = temp1; + temp1 = *ptr1; /* swap odd column with sign change */ + temp2 = *ptr2; + *ptr1++ = -temp2; + *ptr2++ = -temp1; + } + } + if (x_crop_blocks > 0) { + /* Now left-justify the portion of the data to be kept. + * We can't use a single jcopy_block_row() call because that routine + * depends on memcpy(), whose behavior is unspecified for overlapping + * source and destination areas. Sigh. + */ + for (blk_x = 0; blk_x < compptr->width_in_blocks; blk_x++) { + jcopy_block_row(buffer[offset_y] + blk_x + x_crop_blocks, + buffer[offset_y] + blk_x, + (JDIMENSION) 1); + } + } + } + } + } +} + + +LOCAL(void) +do_flip_h (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, + jvirt_barray_ptr *src_coef_arrays, + jvirt_barray_ptr *dst_coef_arrays) +/* Horizontal flip in general cropping case */ +{ + JDIMENSION MCU_cols, comp_width, dst_blk_x, dst_blk_y; + JDIMENSION x_crop_blocks, y_crop_blocks; + int ci, k, offset_y; + JBLOCKARRAY src_buffer, dst_buffer; + JBLOCKROW src_row_ptr, dst_row_ptr; + JCOEFPTR src_ptr, dst_ptr; + jpeg_component_info *compptr; + + /* Here we must output into a separate array because we can't touch + * different rows of a single virtual array simultaneously. Otherwise, + * this is essentially the same as the routine above. + */ + MCU_cols = srcinfo->output_width / + (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); + + for (ci = 0; ci < dstinfo->num_components; ci++) { + compptr = dstinfo->comp_info + ci; + comp_width = MCU_cols * compptr->h_samp_factor; + x_crop_blocks = x_crop_offset * compptr->h_samp_factor; + y_crop_blocks = y_crop_offset * compptr->v_samp_factor; + for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; + dst_blk_y += compptr->v_samp_factor) { + dst_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, + (JDIMENSION) compptr->v_samp_factor, TRUE); + src_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, src_coef_arrays[ci], + dst_blk_y + y_crop_blocks, + (JDIMENSION) compptr->v_samp_factor, FALSE); + for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { + dst_row_ptr = dst_buffer[offset_y]; + src_row_ptr = src_buffer[offset_y]; + for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) { + if (x_crop_blocks + dst_blk_x < comp_width) { + /* Do the mirrorable blocks */ + dst_ptr = dst_row_ptr[dst_blk_x]; + src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1]; + /* this unrolled loop doesn't need to know which row it's on... */ + for (k = 0; k < DCTSIZE2; k += 2) { + *dst_ptr++ = *src_ptr++; /* copy even column */ + *dst_ptr++ = - *src_ptr++; /* copy odd column with sign change */ + } + } else { + /* Copy last partial block(s) verbatim */ + jcopy_block_row(src_row_ptr + dst_blk_x + x_crop_blocks, + dst_row_ptr + dst_blk_x, + (JDIMENSION) 1); + } + } + } + } + } +} + + +LOCAL(void) +do_flip_v (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, + jvirt_barray_ptr *src_coef_arrays, + jvirt_barray_ptr *dst_coef_arrays) +/* Vertical flip */ +{ + JDIMENSION MCU_rows, comp_height, dst_blk_x, dst_blk_y; + JDIMENSION x_crop_blocks, y_crop_blocks; + int ci, i, j, offset_y; + JBLOCKARRAY src_buffer, dst_buffer; + JBLOCKROW src_row_ptr, dst_row_ptr; + JCOEFPTR src_ptr, dst_ptr; + jpeg_component_info *compptr; + + /* We output into a separate array because we can't touch different + * rows of the source virtual array simultaneously. Otherwise, this + * is a pretty straightforward analog of horizontal flip. + * Within a DCT block, vertical mirroring is done by changing the signs + * of odd-numbered rows. + * Partial iMCUs at the bottom edge are copied verbatim. + */ + MCU_rows = srcinfo->output_height / + (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size); + + for (ci = 0; ci < dstinfo->num_components; ci++) { + compptr = dstinfo->comp_info + ci; + comp_height = MCU_rows * compptr->v_samp_factor; + x_crop_blocks = x_crop_offset * compptr->h_samp_factor; + y_crop_blocks = y_crop_offset * compptr->v_samp_factor; + for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; + dst_blk_y += compptr->v_samp_factor) { + dst_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, + (JDIMENSION) compptr->v_samp_factor, TRUE); + if (y_crop_blocks + dst_blk_y < comp_height) { + /* Row is within the mirrorable area. */ + src_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, src_coef_arrays[ci], + comp_height - y_crop_blocks - dst_blk_y - + (JDIMENSION) compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, FALSE); + } else { + /* Bottom-edge blocks will be copied verbatim. */ + src_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, src_coef_arrays[ci], + dst_blk_y + y_crop_blocks, + (JDIMENSION) compptr->v_samp_factor, FALSE); + } + for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { + if (y_crop_blocks + dst_blk_y < comp_height) { + /* Row is within the mirrorable area. */ + dst_row_ptr = dst_buffer[offset_y]; + src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1]; + src_row_ptr += x_crop_blocks; + for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; + dst_blk_x++) { + dst_ptr = dst_row_ptr[dst_blk_x]; + src_ptr = src_row_ptr[dst_blk_x]; + for (i = 0; i < DCTSIZE; i += 2) { + /* copy even row */ + for (j = 0; j < DCTSIZE; j++) + *dst_ptr++ = *src_ptr++; + /* copy odd row with sign change */ + for (j = 0; j < DCTSIZE; j++) + *dst_ptr++ = - *src_ptr++; + } + } + } else { + /* Just copy row verbatim. */ + jcopy_block_row(src_buffer[offset_y] + x_crop_blocks, + dst_buffer[offset_y], + compptr->width_in_blocks); + } + } + } + } +} + + +LOCAL(void) +do_transpose (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, + jvirt_barray_ptr *src_coef_arrays, + jvirt_barray_ptr *dst_coef_arrays) +/* Transpose source into destination */ +{ + JDIMENSION dst_blk_x, dst_blk_y, x_crop_blocks, y_crop_blocks; + int ci, i, j, offset_x, offset_y; + JBLOCKARRAY src_buffer, dst_buffer; + JCOEFPTR src_ptr, dst_ptr; + jpeg_component_info *compptr; + + /* Transposing pixels within a block just requires transposing the + * DCT coefficients. + * Partial iMCUs at the edges require no special treatment; we simply + * process all the available DCT blocks for every component. + */ + for (ci = 0; ci < dstinfo->num_components; ci++) { + compptr = dstinfo->comp_info + ci; + x_crop_blocks = x_crop_offset * compptr->h_samp_factor; + y_crop_blocks = y_crop_offset * compptr->v_samp_factor; + for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; + dst_blk_y += compptr->v_samp_factor) { + dst_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, + (JDIMENSION) compptr->v_samp_factor, TRUE); + for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { + for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; + dst_blk_x += compptr->h_samp_factor) { + src_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, src_coef_arrays[ci], + dst_blk_x + x_crop_blocks, + (JDIMENSION) compptr->h_samp_factor, FALSE); + for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { + dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; + src_ptr = src_buffer[offset_x][dst_blk_y + offset_y + y_crop_blocks]; + for (i = 0; i < DCTSIZE; i++) + for (j = 0; j < DCTSIZE; j++) + dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; + } + } + } + } + } +} + + +LOCAL(void) +do_rot_90 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, + jvirt_barray_ptr *src_coef_arrays, + jvirt_barray_ptr *dst_coef_arrays) +/* 90 degree rotation is equivalent to + * 1. Transposing the image; + * 2. Horizontal mirroring. + * These two steps are merged into a single processing routine. + */ +{ + JDIMENSION MCU_cols, comp_width, dst_blk_x, dst_blk_y; + JDIMENSION x_crop_blocks, y_crop_blocks; + int ci, i, j, offset_x, offset_y; + JBLOCKARRAY src_buffer, dst_buffer; + JCOEFPTR src_ptr, dst_ptr; + jpeg_component_info *compptr; + + /* Because of the horizontal mirror step, we can't process partial iMCUs + * at the (output) right edge properly. They just get transposed and + * not mirrored. + */ + MCU_cols = srcinfo->output_height / + (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); + + for (ci = 0; ci < dstinfo->num_components; ci++) { + compptr = dstinfo->comp_info + ci; + comp_width = MCU_cols * compptr->h_samp_factor; + x_crop_blocks = x_crop_offset * compptr->h_samp_factor; + y_crop_blocks = y_crop_offset * compptr->v_samp_factor; + for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; + dst_blk_y += compptr->v_samp_factor) { + dst_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, + (JDIMENSION) compptr->v_samp_factor, TRUE); + for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { + for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; + dst_blk_x += compptr->h_samp_factor) { + if (x_crop_blocks + dst_blk_x < comp_width) { + /* Block is within the mirrorable area. */ + src_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, src_coef_arrays[ci], + comp_width - x_crop_blocks - dst_blk_x - + (JDIMENSION) compptr->h_samp_factor, + (JDIMENSION) compptr->h_samp_factor, FALSE); + } else { + /* Edge blocks are transposed but not mirrored. */ + src_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, src_coef_arrays[ci], + dst_blk_x + x_crop_blocks, + (JDIMENSION) compptr->h_samp_factor, FALSE); + } + for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { + dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; + if (x_crop_blocks + dst_blk_x < comp_width) { + /* Block is within the mirrorable area. */ + src_ptr = src_buffer[compptr->h_samp_factor - offset_x - 1] + [dst_blk_y + offset_y + y_crop_blocks]; + for (i = 0; i < DCTSIZE; i++) { + for (j = 0; j < DCTSIZE; j++) + dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; + i++; + for (j = 0; j < DCTSIZE; j++) + dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; + } + } else { + /* Edge blocks are transposed but not mirrored. */ + src_ptr = src_buffer[offset_x] + [dst_blk_y + offset_y + y_crop_blocks]; + for (i = 0; i < DCTSIZE; i++) + for (j = 0; j < DCTSIZE; j++) + dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; + } + } + } + } + } + } +} + + +LOCAL(void) +do_rot_270 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, + jvirt_barray_ptr *src_coef_arrays, + jvirt_barray_ptr *dst_coef_arrays) +/* 270 degree rotation is equivalent to + * 1. Horizontal mirroring; + * 2. Transposing the image. + * These two steps are merged into a single processing routine. + */ +{ + JDIMENSION MCU_rows, comp_height, dst_blk_x, dst_blk_y; + JDIMENSION x_crop_blocks, y_crop_blocks; + int ci, i, j, offset_x, offset_y; + JBLOCKARRAY src_buffer, dst_buffer; + JCOEFPTR src_ptr, dst_ptr; + jpeg_component_info *compptr; + + /* Because of the horizontal mirror step, we can't process partial iMCUs + * at the (output) bottom edge properly. They just get transposed and + * not mirrored. + */ + MCU_rows = srcinfo->output_width / + (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size); + + for (ci = 0; ci < dstinfo->num_components; ci++) { + compptr = dstinfo->comp_info + ci; + comp_height = MCU_rows * compptr->v_samp_factor; + x_crop_blocks = x_crop_offset * compptr->h_samp_factor; + y_crop_blocks = y_crop_offset * compptr->v_samp_factor; + for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; + dst_blk_y += compptr->v_samp_factor) { + dst_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, + (JDIMENSION) compptr->v_samp_factor, TRUE); + for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { + for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; + dst_blk_x += compptr->h_samp_factor) { + src_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, src_coef_arrays[ci], + dst_blk_x + x_crop_blocks, + (JDIMENSION) compptr->h_samp_factor, FALSE); + for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { + dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; + if (y_crop_blocks + dst_blk_y < comp_height) { + /* Block is within the mirrorable area. */ + src_ptr = src_buffer[offset_x] + [comp_height - y_crop_blocks - dst_blk_y - offset_y - 1]; + for (i = 0; i < DCTSIZE; i++) { + for (j = 0; j < DCTSIZE; j++) { + dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; + j++; + dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; + } + } + } else { + /* Edge blocks are transposed but not mirrored. */ + src_ptr = src_buffer[offset_x] + [dst_blk_y + offset_y + y_crop_blocks]; + for (i = 0; i < DCTSIZE; i++) + for (j = 0; j < DCTSIZE; j++) + dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; + } + } + } + } + } + } +} + + +LOCAL(void) +do_rot_180 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, + jvirt_barray_ptr *src_coef_arrays, + jvirt_barray_ptr *dst_coef_arrays) +/* 180 degree rotation is equivalent to + * 1. Vertical mirroring; + * 2. Horizontal mirroring. + * These two steps are merged into a single processing routine. + */ +{ + JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y; + JDIMENSION x_crop_blocks, y_crop_blocks; + int ci, i, j, offset_y; + JBLOCKARRAY src_buffer, dst_buffer; + JBLOCKROW src_row_ptr, dst_row_ptr; + JCOEFPTR src_ptr, dst_ptr; + jpeg_component_info *compptr; + + MCU_cols = srcinfo->output_width / + (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); + MCU_rows = srcinfo->output_height / + (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size); + + for (ci = 0; ci < dstinfo->num_components; ci++) { + compptr = dstinfo->comp_info + ci; + comp_width = MCU_cols * compptr->h_samp_factor; + comp_height = MCU_rows * compptr->v_samp_factor; + x_crop_blocks = x_crop_offset * compptr->h_samp_factor; + y_crop_blocks = y_crop_offset * compptr->v_samp_factor; + for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; + dst_blk_y += compptr->v_samp_factor) { + dst_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, + (JDIMENSION) compptr->v_samp_factor, TRUE); + if (y_crop_blocks + dst_blk_y < comp_height) { + /* Row is within the vertically mirrorable area. */ + src_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, src_coef_arrays[ci], + comp_height - y_crop_blocks - dst_blk_y - + (JDIMENSION) compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, FALSE); + } else { + /* Bottom-edge rows are only mirrored horizontally. */ + src_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, src_coef_arrays[ci], + dst_blk_y + y_crop_blocks, + (JDIMENSION) compptr->v_samp_factor, FALSE); + } + for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { + dst_row_ptr = dst_buffer[offset_y]; + if (y_crop_blocks + dst_blk_y < comp_height) { + /* Row is within the mirrorable area. */ + src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1]; + for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) { + dst_ptr = dst_row_ptr[dst_blk_x]; + if (x_crop_blocks + dst_blk_x < comp_width) { + /* Process the blocks that can be mirrored both ways. */ + src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1]; + for (i = 0; i < DCTSIZE; i += 2) { + /* For even row, negate every odd column. */ + for (j = 0; j < DCTSIZE; j += 2) { + *dst_ptr++ = *src_ptr++; + *dst_ptr++ = - *src_ptr++; + } + /* For odd row, negate every even column. */ + for (j = 0; j < DCTSIZE; j += 2) { + *dst_ptr++ = - *src_ptr++; + *dst_ptr++ = *src_ptr++; + } + } + } else { + /* Any remaining right-edge blocks are only mirrored vertically. */ + src_ptr = src_row_ptr[x_crop_blocks + dst_blk_x]; + for (i = 0; i < DCTSIZE; i += 2) { + for (j = 0; j < DCTSIZE; j++) + *dst_ptr++ = *src_ptr++; + for (j = 0; j < DCTSIZE; j++) + *dst_ptr++ = - *src_ptr++; + } + } + } + } else { + /* Remaining rows are just mirrored horizontally. */ + src_row_ptr = src_buffer[offset_y]; + for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) { + if (x_crop_blocks + dst_blk_x < comp_width) { + /* Process the blocks that can be mirrored. */ + dst_ptr = dst_row_ptr[dst_blk_x]; + src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1]; + for (i = 0; i < DCTSIZE2; i += 2) { + *dst_ptr++ = *src_ptr++; + *dst_ptr++ = - *src_ptr++; + } + } else { + /* Any remaining right-edge blocks are only copied. */ + jcopy_block_row(src_row_ptr + dst_blk_x + x_crop_blocks, + dst_row_ptr + dst_blk_x, + (JDIMENSION) 1); + } + } + } + } + } + } +} + + +LOCAL(void) +do_transverse (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, + jvirt_barray_ptr *src_coef_arrays, + jvirt_barray_ptr *dst_coef_arrays) +/* Transverse transpose is equivalent to + * 1. 180 degree rotation; + * 2. Transposition; + * or + * 1. Horizontal mirroring; + * 2. Transposition; + * 3. Horizontal mirroring. + * These steps are merged into a single processing routine. + */ +{ + JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y; + JDIMENSION x_crop_blocks, y_crop_blocks; + int ci, i, j, offset_x, offset_y; + JBLOCKARRAY src_buffer, dst_buffer; + JCOEFPTR src_ptr, dst_ptr; + jpeg_component_info *compptr; + + MCU_cols = srcinfo->output_height / + (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); + MCU_rows = srcinfo->output_width / + (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size); + + for (ci = 0; ci < dstinfo->num_components; ci++) { + compptr = dstinfo->comp_info + ci; + comp_width = MCU_cols * compptr->h_samp_factor; + comp_height = MCU_rows * compptr->v_samp_factor; + x_crop_blocks = x_crop_offset * compptr->h_samp_factor; + y_crop_blocks = y_crop_offset * compptr->v_samp_factor; + for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; + dst_blk_y += compptr->v_samp_factor) { + dst_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, + (JDIMENSION) compptr->v_samp_factor, TRUE); + for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { + for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; + dst_blk_x += compptr->h_samp_factor) { + if (x_crop_blocks + dst_blk_x < comp_width) { + /* Block is within the mirrorable area. */ + src_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, src_coef_arrays[ci], + comp_width - x_crop_blocks - dst_blk_x - + (JDIMENSION) compptr->h_samp_factor, + (JDIMENSION) compptr->h_samp_factor, FALSE); + } else { + src_buffer = (*srcinfo->mem->access_virt_barray) + ((j_common_ptr) srcinfo, src_coef_arrays[ci], + dst_blk_x + x_crop_blocks, + (JDIMENSION) compptr->h_samp_factor, FALSE); + } + for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { + dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; + if (y_crop_blocks + dst_blk_y < comp_height) { + if (x_crop_blocks + dst_blk_x < comp_width) { + /* Block is within the mirrorable area. */ + src_ptr = src_buffer[compptr->h_samp_factor - offset_x - 1] + [comp_height - y_crop_blocks - dst_blk_y - offset_y - 1]; + for (i = 0; i < DCTSIZE; i++) { + for (j = 0; j < DCTSIZE; j++) { + dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; + j++; + dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; + } + i++; + for (j = 0; j < DCTSIZE; j++) { + dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; + j++; + dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; + } + } + } else { + /* Right-edge blocks are mirrored in y only */ + src_ptr = src_buffer[offset_x] + [comp_height - y_crop_blocks - dst_blk_y - offset_y - 1]; + for (i = 0; i < DCTSIZE; i++) { + for (j = 0; j < DCTSIZE; j++) { + dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; + j++; + dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; + } + } + } + } else { + if (x_crop_blocks + dst_blk_x < comp_width) { + /* Bottom-edge blocks are mirrored in x only */ + src_ptr = src_buffer[compptr->h_samp_factor - offset_x - 1] + [dst_blk_y + offset_y + y_crop_blocks]; + for (i = 0; i < DCTSIZE; i++) { + for (j = 0; j < DCTSIZE; j++) + dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; + i++; + for (j = 0; j < DCTSIZE; j++) + dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; + } + } else { + /* At lower right corner, just transpose, no mirroring */ + src_ptr = src_buffer[offset_x] + [dst_blk_y + offset_y + y_crop_blocks]; + for (i = 0; i < DCTSIZE; i++) + for (j = 0; j < DCTSIZE; j++) + dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; + } + } + } + } + } + } + } +} + + +/* Parse an unsigned integer: subroutine for jtransform_parse_crop_spec. + * Returns TRUE if valid integer found, FALSE if not. + * *strptr is advanced over the digit string, and *result is set to its value. + */ + +LOCAL(boolean) +jt_read_integer (const char ** strptr, JDIMENSION * result) +{ + const char * ptr = *strptr; + JDIMENSION val = 0; + + for (; isdigit(*ptr); ptr++) { + val = val * 10 + (JDIMENSION) (*ptr - '0'); + } + *result = val; + if (ptr == *strptr) + return FALSE; /* oops, no digits */ + *strptr = ptr; + return TRUE; +} + + +/* Parse a crop specification (written in X11 geometry style). + * The routine returns TRUE if the spec string is valid, FALSE if not. + * + * The crop spec string should have the format + * x{+-}{+-} + * where width, height, xoffset, and yoffset are unsigned integers. + * Each of the elements can be omitted to indicate a default value. + * (A weakness of this style is that it is not possible to omit xoffset + * while specifying yoffset, since they look alike.) + * + * This code is loosely based on XParseGeometry from the X11 distribution. + */ + +GLOBAL(boolean) +jtransform_parse_crop_spec (jpeg_transform_info *info, const char *spec) +{ + info->crop = FALSE; + info->crop_width_set = JCROP_UNSET; + info->crop_height_set = JCROP_UNSET; + info->crop_xoffset_set = JCROP_UNSET; + info->crop_yoffset_set = JCROP_UNSET; + + if (isdigit(*spec)) { + /* fetch width */ + if (! jt_read_integer(&spec, &info->crop_width)) + return FALSE; + info->crop_width_set = JCROP_POS; + } + if (*spec == 'x' || *spec == 'X') { + /* fetch height */ + spec++; + if (! jt_read_integer(&spec, &info->crop_height)) + return FALSE; + info->crop_height_set = JCROP_POS; + } + if (*spec == '+' || *spec == '-') { + /* fetch xoffset */ + info->crop_xoffset_set = (*spec == '-') ? JCROP_NEG : JCROP_POS; + spec++; + if (! jt_read_integer(&spec, &info->crop_xoffset)) + return FALSE; + } + if (*spec == '+' || *spec == '-') { + /* fetch yoffset */ + info->crop_yoffset_set = (*spec == '-') ? JCROP_NEG : JCROP_POS; + spec++; + if (! jt_read_integer(&spec, &info->crop_yoffset)) + return FALSE; + } + /* We had better have gotten to the end of the string. */ + if (*spec != '\0') + return FALSE; + info->crop = TRUE; + return TRUE; +} + + +/* Trim off any partial iMCUs on the indicated destination edge */ + +LOCAL(void) +trim_right_edge (jpeg_transform_info *info, JDIMENSION full_width) +{ + JDIMENSION MCU_cols; + + MCU_cols = info->output_width / info->iMCU_sample_width; + if (MCU_cols > 0 && info->x_crop_offset + MCU_cols == + full_width / info->iMCU_sample_width) + info->output_width = MCU_cols * info->iMCU_sample_width; +} + +LOCAL(void) +trim_bottom_edge (jpeg_transform_info *info, JDIMENSION full_height) +{ + JDIMENSION MCU_rows; + + MCU_rows = info->output_height / info->iMCU_sample_height; + if (MCU_rows > 0 && info->y_crop_offset + MCU_rows == + full_height / info->iMCU_sample_height) + info->output_height = MCU_rows * info->iMCU_sample_height; +} + + +/* Request any required workspace. + * + * This routine figures out the size that the output image will be + * (which implies that all the transform parameters must be set before + * it is called). + * + * We allocate the workspace virtual arrays from the source decompression + * object, so that all the arrays (both the original data and the workspace) + * will be taken into account while making memory management decisions. + * Hence, this routine must be called after jpeg_read_header (which reads + * the image dimensions) and before jpeg_read_coefficients (which realizes + * the source's virtual arrays). + * + * This function returns FALSE right away if -perfect is given + * and transformation is not perfect. Otherwise returns TRUE. + */ + +GLOBAL(boolean) +jtransform_request_workspace (j_decompress_ptr srcinfo, + jpeg_transform_info *info) +{ + jvirt_barray_ptr *coef_arrays; + boolean need_workspace, transpose_it; + jpeg_component_info *compptr; + JDIMENSION xoffset, yoffset; + JDIMENSION width_in_iMCUs, height_in_iMCUs; + JDIMENSION width_in_blocks, height_in_blocks; + int ci, h_samp_factor, v_samp_factor; + + /* Determine number of components in output image */ + if (info->force_grayscale && + srcinfo->jpeg_color_space == JCS_YCbCr && + srcinfo->num_components == 3) + /* We'll only process the first component */ + info->num_components = 1; + else + /* Process all the components */ + info->num_components = srcinfo->num_components; + + /* Compute output image dimensions and related values. */ + jpeg_core_output_dimensions(srcinfo); + + /* Return right away if -perfect is given and transformation is not perfect. + */ + if (info->perfect) { + if (info->num_components == 1) { + if (!jtransform_perfect_transform(srcinfo->output_width, + srcinfo->output_height, + srcinfo->min_DCT_h_scaled_size, + srcinfo->min_DCT_v_scaled_size, + info->transform)) + return FALSE; + } else { + if (!jtransform_perfect_transform(srcinfo->output_width, + srcinfo->output_height, + srcinfo->max_h_samp_factor * srcinfo->min_DCT_h_scaled_size, + srcinfo->max_v_samp_factor * srcinfo->min_DCT_v_scaled_size, + info->transform)) + return FALSE; + } + } + + /* If there is only one output component, force the iMCU size to be 1; + * else use the source iMCU size. (This allows us to do the right thing + * when reducing color to grayscale, and also provides a handy way of + * cleaning up "funny" grayscale images whose sampling factors are not 1x1.) + */ + switch (info->transform) { + case JXFORM_TRANSPOSE: + case JXFORM_TRANSVERSE: + case JXFORM_ROT_90: + case JXFORM_ROT_270: + info->output_width = srcinfo->output_height; + info->output_height = srcinfo->output_width; + if (info->num_components == 1) { + info->iMCU_sample_width = srcinfo->min_DCT_v_scaled_size; + info->iMCU_sample_height = srcinfo->min_DCT_h_scaled_size; + } else { + info->iMCU_sample_width = + srcinfo->max_v_samp_factor * srcinfo->min_DCT_v_scaled_size; + info->iMCU_sample_height = + srcinfo->max_h_samp_factor * srcinfo->min_DCT_h_scaled_size; + } + break; + default: + info->output_width = srcinfo->output_width; + info->output_height = srcinfo->output_height; + if (info->num_components == 1) { + info->iMCU_sample_width = srcinfo->min_DCT_h_scaled_size; + info->iMCU_sample_height = srcinfo->min_DCT_v_scaled_size; + } else { + info->iMCU_sample_width = + srcinfo->max_h_samp_factor * srcinfo->min_DCT_h_scaled_size; + info->iMCU_sample_height = + srcinfo->max_v_samp_factor * srcinfo->min_DCT_v_scaled_size; + } + break; + } + + /* If cropping has been requested, compute the crop area's position and + * dimensions, ensuring that its upper left corner falls at an iMCU boundary. + */ + if (info->crop) { + /* Insert default values for unset crop parameters */ + if (info->crop_xoffset_set == JCROP_UNSET) + info->crop_xoffset = 0; /* default to +0 */ + if (info->crop_yoffset_set == JCROP_UNSET) + info->crop_yoffset = 0; /* default to +0 */ + if (info->crop_xoffset >= info->output_width || + info->crop_yoffset >= info->output_height) + ERREXIT(srcinfo, JERR_BAD_CROP_SPEC); + if (info->crop_width_set == JCROP_UNSET) + info->crop_width = info->output_width - info->crop_xoffset; + if (info->crop_height_set == JCROP_UNSET) + info->crop_height = info->output_height - info->crop_yoffset; + /* Ensure parameters are valid */ + if (info->crop_width <= 0 || info->crop_width > info->output_width || + info->crop_height <= 0 || info->crop_height > info->output_height || + info->crop_xoffset > info->output_width - info->crop_width || + info->crop_yoffset > info->output_height - info->crop_height) + ERREXIT(srcinfo, JERR_BAD_CROP_SPEC); + /* Convert negative crop offsets into regular offsets */ + if (info->crop_xoffset_set == JCROP_NEG) + xoffset = info->output_width - info->crop_width - info->crop_xoffset; + else + xoffset = info->crop_xoffset; + if (info->crop_yoffset_set == JCROP_NEG) + yoffset = info->output_height - info->crop_height - info->crop_yoffset; + else + yoffset = info->crop_yoffset; + /* Now adjust so that upper left corner falls at an iMCU boundary */ + info->output_width = + info->crop_width + (xoffset % info->iMCU_sample_width); + info->output_height = + info->crop_height + (yoffset % info->iMCU_sample_height); + /* Save x/y offsets measured in iMCUs */ + info->x_crop_offset = xoffset / info->iMCU_sample_width; + info->y_crop_offset = yoffset / info->iMCU_sample_height; + } else { + info->x_crop_offset = 0; + info->y_crop_offset = 0; + } + + /* Figure out whether we need workspace arrays, + * and if so whether they are transposed relative to the source. + */ + need_workspace = FALSE; + transpose_it = FALSE; + switch (info->transform) { + case JXFORM_NONE: + if (info->x_crop_offset != 0 || info->y_crop_offset != 0) + need_workspace = TRUE; + /* No workspace needed if neither cropping nor transforming */ + break; + case JXFORM_FLIP_H: + if (info->trim) + trim_right_edge(info, srcinfo->output_width); + if (info->y_crop_offset != 0) + need_workspace = TRUE; + /* do_flip_h_no_crop doesn't need a workspace array */ + break; + case JXFORM_FLIP_V: + if (info->trim) + trim_bottom_edge(info, srcinfo->output_height); + /* Need workspace arrays having same dimensions as source image. */ + need_workspace = TRUE; + break; + case JXFORM_TRANSPOSE: + /* transpose does NOT have to trim anything */ + /* Need workspace arrays having transposed dimensions. */ + need_workspace = TRUE; + transpose_it = TRUE; + break; + case JXFORM_TRANSVERSE: + if (info->trim) { + trim_right_edge(info, srcinfo->output_height); + trim_bottom_edge(info, srcinfo->output_width); + } + /* Need workspace arrays having transposed dimensions. */ + need_workspace = TRUE; + transpose_it = TRUE; + break; + case JXFORM_ROT_90: + if (info->trim) + trim_right_edge(info, srcinfo->output_height); + /* Need workspace arrays having transposed dimensions. */ + need_workspace = TRUE; + transpose_it = TRUE; + break; + case JXFORM_ROT_180: + if (info->trim) { + trim_right_edge(info, srcinfo->output_width); + trim_bottom_edge(info, srcinfo->output_height); + } + /* Need workspace arrays having same dimensions as source image. */ + need_workspace = TRUE; + break; + case JXFORM_ROT_270: + if (info->trim) + trim_bottom_edge(info, srcinfo->output_width); + /* Need workspace arrays having transposed dimensions. */ + need_workspace = TRUE; + transpose_it = TRUE; + break; + } + + /* Allocate workspace if needed. + * Note that we allocate arrays padded out to the next iMCU boundary, + * so that transform routines need not worry about missing edge blocks. + */ + if (need_workspace) { + coef_arrays = (jvirt_barray_ptr *) + (*srcinfo->mem->alloc_small) ((j_common_ptr) srcinfo, JPOOL_IMAGE, + SIZEOF(jvirt_barray_ptr) * info->num_components); + width_in_iMCUs = (JDIMENSION) + jdiv_round_up((long) info->output_width, + (long) info->iMCU_sample_width); + height_in_iMCUs = (JDIMENSION) + jdiv_round_up((long) info->output_height, + (long) info->iMCU_sample_height); + for (ci = 0; ci < info->num_components; ci++) { + compptr = srcinfo->comp_info + ci; + if (info->num_components == 1) { + /* we're going to force samp factors to 1x1 in this case */ + h_samp_factor = v_samp_factor = 1; + } else if (transpose_it) { + h_samp_factor = compptr->v_samp_factor; + v_samp_factor = compptr->h_samp_factor; + } else { + h_samp_factor = compptr->h_samp_factor; + v_samp_factor = compptr->v_samp_factor; + } + width_in_blocks = width_in_iMCUs * h_samp_factor; + height_in_blocks = height_in_iMCUs * v_samp_factor; + coef_arrays[ci] = (*srcinfo->mem->request_virt_barray) + ((j_common_ptr) srcinfo, JPOOL_IMAGE, FALSE, + width_in_blocks, height_in_blocks, (JDIMENSION) v_samp_factor); + } + info->workspace_coef_arrays = coef_arrays; + } else + info->workspace_coef_arrays = NULL; + + return TRUE; +} + + +/* Transpose destination image parameters */ + +LOCAL(void) +transpose_critical_parameters (j_compress_ptr dstinfo) +{ + int tblno, i, j, ci, itemp; + jpeg_component_info *compptr; + JQUANT_TBL *qtblptr; + JDIMENSION jtemp; + UINT16 qtemp; + + /* Transpose image dimensions */ + jtemp = dstinfo->image_width; + dstinfo->image_width = dstinfo->image_height; + dstinfo->image_height = jtemp; + itemp = dstinfo->min_DCT_h_scaled_size; + dstinfo->min_DCT_h_scaled_size = dstinfo->min_DCT_v_scaled_size; + dstinfo->min_DCT_v_scaled_size = itemp; + + /* Transpose sampling factors */ + for (ci = 0; ci < dstinfo->num_components; ci++) { + compptr = dstinfo->comp_info + ci; + itemp = compptr->h_samp_factor; + compptr->h_samp_factor = compptr->v_samp_factor; + compptr->v_samp_factor = itemp; + } + + /* Transpose quantization tables */ + for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) { + qtblptr = dstinfo->quant_tbl_ptrs[tblno]; + if (qtblptr != NULL) { + for (i = 0; i < DCTSIZE; i++) { + for (j = 0; j < i; j++) { + qtemp = qtblptr->quantval[i*DCTSIZE+j]; + qtblptr->quantval[i*DCTSIZE+j] = qtblptr->quantval[j*DCTSIZE+i]; + qtblptr->quantval[j*DCTSIZE+i] = qtemp; + } + } + } + } +} + + +/* Adjust Exif image parameters. + * + * We try to adjust the Tags ExifImageWidth and ExifImageHeight if possible. + */ + +LOCAL(void) +adjust_exif_parameters (JOCTET FAR * data, unsigned int length, + JDIMENSION new_width, JDIMENSION new_height) +{ + boolean is_motorola; /* Flag for byte order */ + unsigned int number_of_tags, tagnum; + unsigned int firstoffset, offset; + JDIMENSION new_value; + + if (length < 12) return; /* Length of an IFD entry */ + + /* Discover byte order */ + if (GETJOCTET(data[0]) == 0x49 && GETJOCTET(data[1]) == 0x49) + is_motorola = FALSE; + else if (GETJOCTET(data[0]) == 0x4D && GETJOCTET(data[1]) == 0x4D) + is_motorola = TRUE; + else + return; + + /* Check Tag Mark */ + if (is_motorola) { + if (GETJOCTET(data[2]) != 0) return; + if (GETJOCTET(data[3]) != 0x2A) return; + } else { + if (GETJOCTET(data[3]) != 0) return; + if (GETJOCTET(data[2]) != 0x2A) return; + } + + /* Get first IFD offset (offset to IFD0) */ + if (is_motorola) { + if (GETJOCTET(data[4]) != 0) return; + if (GETJOCTET(data[5]) != 0) return; + firstoffset = GETJOCTET(data[6]); + firstoffset <<= 8; + firstoffset += GETJOCTET(data[7]); + } else { + if (GETJOCTET(data[7]) != 0) return; + if (GETJOCTET(data[6]) != 0) return; + firstoffset = GETJOCTET(data[5]); + firstoffset <<= 8; + firstoffset += GETJOCTET(data[4]); + } + if (firstoffset > length - 2) return; /* check end of data segment */ + + /* Get the number of directory entries contained in this IFD */ + if (is_motorola) { + number_of_tags = GETJOCTET(data[firstoffset]); + number_of_tags <<= 8; + number_of_tags += GETJOCTET(data[firstoffset+1]); + } else { + number_of_tags = GETJOCTET(data[firstoffset+1]); + number_of_tags <<= 8; + number_of_tags += GETJOCTET(data[firstoffset]); + } + if (number_of_tags == 0) return; + firstoffset += 2; + + /* Search for ExifSubIFD offset Tag in IFD0 */ + for (;;) { + if (firstoffset > length - 12) return; /* check end of data segment */ + /* Get Tag number */ + if (is_motorola) { + tagnum = GETJOCTET(data[firstoffset]); + tagnum <<= 8; + tagnum += GETJOCTET(data[firstoffset+1]); + } else { + tagnum = GETJOCTET(data[firstoffset+1]); + tagnum <<= 8; + tagnum += GETJOCTET(data[firstoffset]); + } + if (tagnum == 0x8769) break; /* found ExifSubIFD offset Tag */ + if (--number_of_tags == 0) return; + firstoffset += 12; + } + + /* Get the ExifSubIFD offset */ + if (is_motorola) { + if (GETJOCTET(data[firstoffset+8]) != 0) return; + if (GETJOCTET(data[firstoffset+9]) != 0) return; + offset = GETJOCTET(data[firstoffset+10]); + offset <<= 8; + offset += GETJOCTET(data[firstoffset+11]); + } else { + if (GETJOCTET(data[firstoffset+11]) != 0) return; + if (GETJOCTET(data[firstoffset+10]) != 0) return; + offset = GETJOCTET(data[firstoffset+9]); + offset <<= 8; + offset += GETJOCTET(data[firstoffset+8]); + } + if (offset > length - 2) return; /* check end of data segment */ + + /* Get the number of directory entries contained in this SubIFD */ + if (is_motorola) { + number_of_tags = GETJOCTET(data[offset]); + number_of_tags <<= 8; + number_of_tags += GETJOCTET(data[offset+1]); + } else { + number_of_tags = GETJOCTET(data[offset+1]); + number_of_tags <<= 8; + number_of_tags += GETJOCTET(data[offset]); + } + if (number_of_tags < 2) return; + offset += 2; + + /* Search for ExifImageWidth and ExifImageHeight Tags in this SubIFD */ + do { + if (offset > length - 12) return; /* check end of data segment */ + /* Get Tag number */ + if (is_motorola) { + tagnum = GETJOCTET(data[offset]); + tagnum <<= 8; + tagnum += GETJOCTET(data[offset+1]); + } else { + tagnum = GETJOCTET(data[offset+1]); + tagnum <<= 8; + tagnum += GETJOCTET(data[offset]); + } + if (tagnum == 0xA002 || tagnum == 0xA003) { + if (tagnum == 0xA002) + new_value = new_width; /* ExifImageWidth Tag */ + else + new_value = new_height; /* ExifImageHeight Tag */ + if (is_motorola) { + data[offset+2] = 0; /* Format = unsigned long (4 octets) */ + data[offset+3] = 4; + data[offset+4] = 0; /* Number Of Components = 1 */ + data[offset+5] = 0; + data[offset+6] = 0; + data[offset+7] = 1; + data[offset+8] = 0; + data[offset+9] = 0; + data[offset+10] = (JOCTET)((new_value >> 8) & 0xFF); + data[offset+11] = (JOCTET)(new_value & 0xFF); + } else { + data[offset+2] = 4; /* Format = unsigned long (4 octets) */ + data[offset+3] = 0; + data[offset+4] = 1; /* Number Of Components = 1 */ + data[offset+5] = 0; + data[offset+6] = 0; + data[offset+7] = 0; + data[offset+8] = (JOCTET)(new_value & 0xFF); + data[offset+9] = (JOCTET)((new_value >> 8) & 0xFF); + data[offset+10] = 0; + data[offset+11] = 0; + } + } + offset += 12; + } while (--number_of_tags); +} + + +/* Adjust output image parameters as needed. + * + * This must be called after jpeg_copy_critical_parameters() + * and before jpeg_write_coefficients(). + * + * The return value is the set of virtual coefficient arrays to be written + * (either the ones allocated by jtransform_request_workspace, or the + * original source data arrays). The caller will need to pass this value + * to jpeg_write_coefficients(). + */ + +GLOBAL(jvirt_barray_ptr *) +jtransform_adjust_parameters (j_decompress_ptr srcinfo, + j_compress_ptr dstinfo, + jvirt_barray_ptr *src_coef_arrays, + jpeg_transform_info *info) +{ + /* If force-to-grayscale is requested, adjust destination parameters */ + if (info->force_grayscale) { + /* First, ensure we have YCbCr or grayscale data, and that the source's + * Y channel is full resolution. (No reasonable person would make Y + * be less than full resolution, so actually coping with that case + * isn't worth extra code space. But we check it to avoid crashing.) + */ + if (((dstinfo->jpeg_color_space == JCS_YCbCr && + dstinfo->num_components == 3) || + (dstinfo->jpeg_color_space == JCS_GRAYSCALE && + dstinfo->num_components == 1)) && + srcinfo->comp_info[0].h_samp_factor == srcinfo->max_h_samp_factor && + srcinfo->comp_info[0].v_samp_factor == srcinfo->max_v_samp_factor) { + /* We use jpeg_set_colorspace to make sure subsidiary settings get fixed + * properly. Among other things, it sets the target h_samp_factor & + * v_samp_factor to 1, which typically won't match the source. + * We have to preserve the source's quantization table number, however. + */ + int sv_quant_tbl_no = dstinfo->comp_info[0].quant_tbl_no; + jpeg_set_colorspace(dstinfo, JCS_GRAYSCALE); + dstinfo->comp_info[0].quant_tbl_no = sv_quant_tbl_no; + } else { + /* Sorry, can't do it */ + ERREXIT(dstinfo, JERR_CONVERSION_NOTIMPL); + } + } else if (info->num_components == 1) { + /* For a single-component source, we force the destination sampling factors + * to 1x1, with or without force_grayscale. This is useful because some + * decoders choke on grayscale images with other sampling factors. + */ + dstinfo->comp_info[0].h_samp_factor = 1; + dstinfo->comp_info[0].v_samp_factor = 1; + } + + /* Correct the destination's image dimensions as necessary + * for rotate/flip, resize, and crop operations. + */ + dstinfo->jpeg_width = info->output_width; + dstinfo->jpeg_height = info->output_height; + + /* Transpose destination image parameters */ + switch (info->transform) { + case JXFORM_TRANSPOSE: + case JXFORM_TRANSVERSE: + case JXFORM_ROT_90: + case JXFORM_ROT_270: + transpose_critical_parameters(dstinfo); + break; + default: + break; + } + + /* Adjust Exif properties */ + if (srcinfo->marker_list != NULL && + srcinfo->marker_list->marker == JPEG_APP0+1 && + srcinfo->marker_list->data_length >= 6 && + GETJOCTET(srcinfo->marker_list->data[0]) == 0x45 && + GETJOCTET(srcinfo->marker_list->data[1]) == 0x78 && + GETJOCTET(srcinfo->marker_list->data[2]) == 0x69 && + GETJOCTET(srcinfo->marker_list->data[3]) == 0x66 && + GETJOCTET(srcinfo->marker_list->data[4]) == 0 && + GETJOCTET(srcinfo->marker_list->data[5]) == 0) { + /* Suppress output of JFIF marker */ + dstinfo->write_JFIF_header = FALSE; + /* Adjust Exif image parameters */ + if (dstinfo->jpeg_width != srcinfo->image_width || + dstinfo->jpeg_height != srcinfo->image_height) + /* Align data segment to start of TIFF structure for parsing */ + adjust_exif_parameters(srcinfo->marker_list->data + 6, + srcinfo->marker_list->data_length - 6, + dstinfo->jpeg_width, dstinfo->jpeg_height); + } + + /* Return the appropriate output data set */ + if (info->workspace_coef_arrays != NULL) + return info->workspace_coef_arrays; + return src_coef_arrays; +} + + +/* Execute the actual transformation, if any. + * + * This must be called *after* jpeg_write_coefficients, because it depends + * on jpeg_write_coefficients to have computed subsidiary values such as + * the per-component width and height fields in the destination object. + * + * Note that some transformations will modify the source data arrays! + */ + +GLOBAL(void) +jtransform_execute_transform (j_decompress_ptr srcinfo, + j_compress_ptr dstinfo, + jvirt_barray_ptr *src_coef_arrays, + jpeg_transform_info *info) +{ + jvirt_barray_ptr *dst_coef_arrays = info->workspace_coef_arrays; + + /* Note: conditions tested here should match those in switch statement + * in jtransform_request_workspace() + */ + switch (info->transform) { + case JXFORM_NONE: + if (info->x_crop_offset != 0 || info->y_crop_offset != 0) + do_crop(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, + src_coef_arrays, dst_coef_arrays); + break; + case JXFORM_FLIP_H: + if (info->y_crop_offset != 0) + do_flip_h(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, + src_coef_arrays, dst_coef_arrays); + else + do_flip_h_no_crop(srcinfo, dstinfo, info->x_crop_offset, + src_coef_arrays); + break; + case JXFORM_FLIP_V: + do_flip_v(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, + src_coef_arrays, dst_coef_arrays); + break; + case JXFORM_TRANSPOSE: + do_transpose(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, + src_coef_arrays, dst_coef_arrays); + break; + case JXFORM_TRANSVERSE: + do_transverse(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, + src_coef_arrays, dst_coef_arrays); + break; + case JXFORM_ROT_90: + do_rot_90(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, + src_coef_arrays, dst_coef_arrays); + break; + case JXFORM_ROT_180: + do_rot_180(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, + src_coef_arrays, dst_coef_arrays); + break; + case JXFORM_ROT_270: + do_rot_270(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, + src_coef_arrays, dst_coef_arrays); + break; + } +} + +/* jtransform_perfect_transform + * + * Determine whether lossless transformation is perfectly + * possible for a specified image and transformation. + * + * Inputs: + * image_width, image_height: source image dimensions. + * MCU_width, MCU_height: pixel dimensions of MCU. + * transform: transformation identifier. + * Parameter sources from initialized jpeg_struct + * (after reading source header): + * image_width = cinfo.image_width + * image_height = cinfo.image_height + * MCU_width = cinfo.max_h_samp_factor * cinfo.block_size + * MCU_height = cinfo.max_v_samp_factor * cinfo.block_size + * Result: + * TRUE = perfect transformation possible + * FALSE = perfect transformation not possible + * (may use custom action then) + */ + +GLOBAL(boolean) +jtransform_perfect_transform(JDIMENSION image_width, JDIMENSION image_height, + int MCU_width, int MCU_height, + JXFORM_CODE transform) +{ + boolean result = TRUE; /* initialize TRUE */ + + switch (transform) { + case JXFORM_FLIP_H: + case JXFORM_ROT_270: + if (image_width % (JDIMENSION) MCU_width) + result = FALSE; + break; + case JXFORM_FLIP_V: + case JXFORM_ROT_90: + if (image_height % (JDIMENSION) MCU_height) + result = FALSE; + break; + case JXFORM_TRANSVERSE: + case JXFORM_ROT_180: + if (image_width % (JDIMENSION) MCU_width) + result = FALSE; + if (image_height % (JDIMENSION) MCU_height) + result = FALSE; + break; + default: + break; + } + + return result; +} + +#endif /* TRANSFORMS_SUPPORTED */ + + +/* Setup decompression object to save desired markers in memory. + * This must be called before jpeg_read_header() to have the desired effect. + */ + +GLOBAL(void) +jcopy_markers_setup (j_decompress_ptr srcinfo, JCOPY_OPTION option) +{ +#ifdef SAVE_MARKERS_SUPPORTED + int m; + + /* Save comments except under NONE option */ + if (option != JCOPYOPT_NONE) { + jpeg_save_markers(srcinfo, JPEG_COM, 0xFFFF); + } + /* Save all types of APPn markers iff ALL option */ + if (option == JCOPYOPT_ALL) { + for (m = 0; m < 16; m++) + jpeg_save_markers(srcinfo, JPEG_APP0 + m, 0xFFFF); + } +#endif /* SAVE_MARKERS_SUPPORTED */ +} + +/* Copy markers saved in the given source object to the destination object. + * This should be called just after jpeg_start_compress() or + * jpeg_write_coefficients(). + * Note that those routines will have written the SOI, and also the + * JFIF APP0 or Adobe APP14 markers if selected. + */ + +GLOBAL(void) +jcopy_markers_execute (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + JCOPY_OPTION option) +{ + jpeg_saved_marker_ptr marker; + + /* In the current implementation, we don't actually need to examine the + * option flag here; we just copy everything that got saved. + * But to avoid confusion, we do not output JFIF and Adobe APP14 markers + * if the encoder library already wrote one. + */ + for (marker = srcinfo->marker_list; marker != NULL; marker = marker->next) { + if (dstinfo->write_JFIF_header && + marker->marker == JPEG_APP0 && + marker->data_length >= 5 && + GETJOCTET(marker->data[0]) == 0x4A && + GETJOCTET(marker->data[1]) == 0x46 && + GETJOCTET(marker->data[2]) == 0x49 && + GETJOCTET(marker->data[3]) == 0x46 && + GETJOCTET(marker->data[4]) == 0) + continue; /* reject duplicate JFIF */ + if (dstinfo->write_Adobe_marker && + marker->marker == JPEG_APP0+14 && + marker->data_length >= 5 && + GETJOCTET(marker->data[0]) == 0x41 && + GETJOCTET(marker->data[1]) == 0x64 && + GETJOCTET(marker->data[2]) == 0x6F && + GETJOCTET(marker->data[3]) == 0x62 && + GETJOCTET(marker->data[4]) == 0x65) + continue; /* reject duplicate Adobe */ +#ifdef NEED_FAR_POINTERS + /* We could use jpeg_write_marker if the data weren't FAR... */ + { + unsigned int i; + jpeg_write_m_header(dstinfo, marker->marker, marker->data_length); + for (i = 0; i < marker->data_length; i++) + jpeg_write_m_byte(dstinfo, marker->data[i]); + } +#else + jpeg_write_marker(dstinfo, marker->marker, + marker->data, marker->data_length); +#endif + } +} diff --git a/jpeg-8c/transupp.h b/jpeg-8c/transupp.h new file mode 100644 index 00000000..7c16c19c --- /dev/null +++ b/jpeg-8c/transupp.h @@ -0,0 +1,210 @@ +/* + * transupp.h + * + * Copyright (C) 1997-2009, Thomas G. Lane, Guido Vollbeding. + * 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 image transformation routines and + * other utility code used by the jpegtran sample application. These are + * NOT part of the core JPEG library. But we keep these routines separate + * from jpegtran.c to ease the task of maintaining jpegtran-like programs + * that have other user interfaces. + * + * NOTE: all the routines declared here have very specific requirements + * about when they are to be executed during the reading and writing of the + * source and destination files. See the comments in transupp.c, or see + * jpegtran.c for an example of correct usage. + */ + +/* If you happen not to want the image transform support, disable it here */ +#ifndef TRANSFORMS_SUPPORTED +#define TRANSFORMS_SUPPORTED 1 /* 0 disables transform code */ +#endif + +/* + * Although rotating and flipping data expressed as DCT coefficients is not + * hard, there is an asymmetry in the JPEG format specification for images + * whose dimensions aren't multiples of the iMCU size. The right and bottom + * image edges are padded out to the next iMCU boundary with junk data; but + * no padding is possible at the top and left edges. If we were to flip + * the whole image including the pad data, then pad garbage would become + * visible at the top and/or left, and real pixels would disappear into the + * pad margins --- perhaps permanently, since encoders & decoders may not + * bother to preserve DCT blocks that appear to be completely outside the + * nominal image area. So, we have to exclude any partial iMCUs from the + * basic transformation. + * + * Transpose is the only transformation that can handle partial iMCUs at the + * right and bottom edges completely cleanly. flip_h can flip partial iMCUs + * at the bottom, but leaves any partial iMCUs at the right edge untouched. + * Similarly flip_v leaves any partial iMCUs at the bottom edge untouched. + * The other transforms are defined as combinations of these basic transforms + * and process edge blocks in a way that preserves the equivalence. + * + * The "trim" option causes untransformable partial iMCUs to be dropped; + * this is not strictly lossless, but it usually gives the best-looking + * result for odd-size images. Note that when this option is active, + * the expected mathematical equivalences between the transforms may not hold. + * (For example, -rot 270 -trim trims only the bottom edge, but -rot 90 -trim + * followed by -rot 180 -trim trims both edges.) + * + * We also offer a lossless-crop option, which discards data outside a given + * image region but losslessly preserves what is inside. Like the rotate and + * flip transforms, lossless crop is restricted by the JPEG format: the upper + * left corner of the selected region must fall on an iMCU boundary. If this + * does not hold for the given crop parameters, we silently move the upper left + * corner up and/or left to make it so, simultaneously increasing the region + * dimensions to keep the lower right crop corner unchanged. (Thus, the + * output image covers at least the requested region, but may cover more.) + * + * We also provide a lossless-resize option, which is kind of a lossless-crop + * operation in the DCT coefficient block domain - it discards higher-order + * coefficients and losslessly preserves lower-order coefficients of a + * sub-block. + * + * Rotate/flip transform, resize, and crop can be requested together in a + * single invocation. The crop is applied last --- that is, the crop region + * is specified in terms of the destination image after transform/resize. + * + * We also offer a "force to grayscale" option, which simply discards the + * chrominance channels of a YCbCr image. This is lossless in the sense that + * the luminance channel is preserved exactly. It's not the same kind of + * thing as the rotate/flip transformations, but it's convenient to handle it + * as part of this package, mainly because the transformation routines have to + * be aware of the option to know how many components to work on. + */ + + +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jtransform_parse_crop_spec jTrParCrop +#define jtransform_request_workspace jTrRequest +#define jtransform_adjust_parameters jTrAdjust +#define jtransform_execute_transform jTrExec +#define jtransform_perfect_transform jTrPerfect +#define jcopy_markers_setup jCMrkSetup +#define jcopy_markers_execute jCMrkExec +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* + * Codes for supported types of image transformations. + */ + +typedef enum { + JXFORM_NONE, /* no transformation */ + JXFORM_FLIP_H, /* horizontal flip */ + JXFORM_FLIP_V, /* vertical flip */ + JXFORM_TRANSPOSE, /* transpose across UL-to-LR axis */ + JXFORM_TRANSVERSE, /* transpose across UR-to-LL axis */ + JXFORM_ROT_90, /* 90-degree clockwise rotation */ + JXFORM_ROT_180, /* 180-degree rotation */ + JXFORM_ROT_270 /* 270-degree clockwise (or 90 ccw) */ +} JXFORM_CODE; + +/* + * Codes for crop parameters, which can individually be unspecified, + * positive, or negative. (Negative width or height makes no sense, though.) + */ + +typedef enum { + JCROP_UNSET, + JCROP_POS, + JCROP_NEG +} JCROP_CODE; + +/* + * Transform parameters struct. + * NB: application must not change any elements of this struct after + * calling jtransform_request_workspace. + */ + +typedef struct { + /* Options: set by caller */ + JXFORM_CODE transform; /* image transform operator */ + boolean perfect; /* if TRUE, fail if partial MCUs are requested */ + boolean trim; /* if TRUE, trim partial MCUs as needed */ + boolean force_grayscale; /* if TRUE, convert color image to grayscale */ + boolean crop; /* if TRUE, crop source image */ + + /* Crop parameters: application need not set these unless crop is TRUE. + * These can be filled in by jtransform_parse_crop_spec(). + */ + JDIMENSION crop_width; /* Width of selected region */ + JCROP_CODE crop_width_set; + JDIMENSION crop_height; /* Height of selected region */ + JCROP_CODE crop_height_set; + JDIMENSION crop_xoffset; /* X offset of selected region */ + JCROP_CODE crop_xoffset_set; /* (negative measures from right edge) */ + JDIMENSION crop_yoffset; /* Y offset of selected region */ + JCROP_CODE crop_yoffset_set; /* (negative measures from bottom edge) */ + + /* Internal workspace: caller should not touch these */ + int num_components; /* # of components in workspace */ + jvirt_barray_ptr * workspace_coef_arrays; /* workspace for transformations */ + JDIMENSION output_width; /* cropped destination dimensions */ + JDIMENSION output_height; + JDIMENSION x_crop_offset; /* destination crop offsets measured in iMCUs */ + JDIMENSION y_crop_offset; + int iMCU_sample_width; /* destination iMCU size */ + int iMCU_sample_height; +} jpeg_transform_info; + + +#if TRANSFORMS_SUPPORTED + +/* Parse a crop specification (written in X11 geometry style) */ +EXTERN(boolean) jtransform_parse_crop_spec + JPP((jpeg_transform_info *info, const char *spec)); +/* Request any required workspace */ +EXTERN(boolean) jtransform_request_workspace + JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info)); +/* Adjust output image parameters */ +EXTERN(jvirt_barray_ptr *) jtransform_adjust_parameters + JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + jvirt_barray_ptr *src_coef_arrays, + jpeg_transform_info *info)); +/* Execute the actual transformation, if any */ +EXTERN(void) jtransform_execute_transform + JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + jvirt_barray_ptr *src_coef_arrays, + jpeg_transform_info *info)); +/* Determine whether lossless transformation is perfectly + * possible for a specified image and transformation. + */ +EXTERN(boolean) jtransform_perfect_transform + JPP((JDIMENSION image_width, JDIMENSION image_height, + int MCU_width, int MCU_height, + JXFORM_CODE transform)); + +/* jtransform_execute_transform used to be called + * jtransform_execute_transformation, but some compilers complain about + * routine names that long. This macro is here to avoid breaking any + * old source code that uses the original name... + */ +#define jtransform_execute_transformation jtransform_execute_transform + +#endif /* TRANSFORMS_SUPPORTED */ + + +/* + * Support for copying optional markers from source to destination file. + */ + +typedef enum { + JCOPYOPT_NONE, /* copy no optional markers */ + JCOPYOPT_COMMENTS, /* copy only comment (COM) markers */ + JCOPYOPT_ALL /* copy all optional markers */ +} JCOPY_OPTION; + +#define JCOPYOPT_DEFAULT JCOPYOPT_COMMENTS /* recommended default */ + +/* Setup decompression object to save desired markers in memory */ +EXTERN(void) jcopy_markers_setup + JPP((j_decompress_ptr srcinfo, JCOPY_OPTION option)); +/* Copy markers saved in the given source object to the destination object */ +EXTERN(void) jcopy_markers_execute + JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + JCOPY_OPTION option)); diff --git a/jpeg-8c/usage.txt b/jpeg-8c/usage.txt new file mode 100644 index 00000000..eae58425 --- /dev/null +++ b/jpeg-8c/usage.txt @@ -0,0 +1,631 @@ +USAGE instructions for the Independent JPEG Group's JPEG software +================================================================= + +This file describes usage of the JPEG conversion programs cjpeg and djpeg, +as well as the utility programs jpegtran, rdjpgcom and wrjpgcom. (See +the other documentation files if you wish to use the JPEG library within +your own programs.) + +If you are on a Unix machine you may prefer to read the Unix-style manual +pages in files cjpeg.1, djpeg.1, jpegtran.1, rdjpgcom.1, wrjpgcom.1. + + +INTRODUCTION + +These programs implement JPEG image encoding, decoding, and transcoding. +JPEG (pronounced "jay-peg") is a standardized compression method for +full-color and gray-scale images. + + +GENERAL USAGE + +We provide two programs, cjpeg to compress an image file into JPEG format, +and djpeg to decompress a JPEG file back into a conventional image format. + +On Unix-like systems, you say: + cjpeg [switches] [imagefile] >jpegfile +or + djpeg [switches] [jpegfile] >imagefile +The programs read the specified input file, or standard input if none is +named. They always write to standard output (with trace/error messages to +standard error). These conventions are handy for piping images between +programs. + +On most non-Unix systems, you say: + cjpeg [switches] imagefile jpegfile +or + djpeg [switches] jpegfile imagefile +i.e., both the input and output files are named on the command line. This +style is a little more foolproof, and it loses no functionality if you don't +have pipes. (You can get this style on Unix too, if you prefer, by defining +TWO_FILE_COMMANDLINE when you compile the programs; see install.txt.) + +You can also say: + cjpeg [switches] -outfile jpegfile imagefile +or + djpeg [switches] -outfile imagefile jpegfile +This syntax works on all systems, so it is useful for scripts. + +The currently supported image file formats are: PPM (PBMPLUS color format), +PGM (PBMPLUS gray-scale format), BMP, Targa, and RLE (Utah Raster Toolkit +format). (RLE is supported only if the URT library is available.) +cjpeg recognizes the input image format automatically, with the exception +of some Targa-format files. You have to tell djpeg which format to generate. + +JPEG files are in the defacto standard JFIF file format. There are other, +less widely used JPEG-based file formats, but we don't support them. + +All switch names may be abbreviated; for example, -grayscale may be written +-gray or -gr. Most of the "basic" switches can be abbreviated to as little as +one letter. Upper and lower case are equivalent (-BMP is the same as -bmp). +British spellings are also accepted (e.g., -greyscale), though for brevity +these are not mentioned below. + + +CJPEG DETAILS + +The basic command line switches for cjpeg are: + + -quality N[,...] Scale quantization tables to adjust image quality. + Quality is 0 (worst) to 100 (best); default is 75. + (See below for more info.) + + -grayscale Create monochrome JPEG file from color input. + Be sure to use this switch when compressing a grayscale + BMP file, because cjpeg isn't bright enough to notice + whether a BMP file uses only shades of gray. By + saying -grayscale, you'll get a smaller JPEG file that + takes less time to process. + + -optimize Perform optimization of entropy encoding parameters. + Without this, default encoding parameters are used. + -optimize usually makes the JPEG file a little smaller, + but cjpeg runs somewhat slower and needs much more + memory. Image quality and speed of decompression are + unaffected by -optimize. + + -progressive Create progressive JPEG file (see below). + + -scale M/N Scale the output image by a factor M/N. Currently + supported scale factors are M/N with all N from 1 to + 16, where M is the destination DCT size, which is 8 by + default (see -block N switch below). + + -targa Input file is Targa format. Targa files that contain + an "identification" field will not be automatically + recognized by cjpeg; for such files you must specify + -targa to make cjpeg treat the input as Targa format. + For most Targa files, you won't need this switch. + +The -quality switch lets you trade off compressed file size against quality of +the reconstructed image: the higher the quality setting, the larger the JPEG +file, and the closer the output image will be to the original input. Normally +you want to use the lowest quality setting (smallest file) that decompresses +into something visually indistinguishable from the original image. For this +purpose the quality setting should be between 50 and 95; the default of 75 is +often about right. If you see defects at -quality 75, then go up 5 or 10 +counts at a time until you are happy with the output image. (The optimal +setting will vary from one image to another.) + +-quality 100 will generate a quantization table of all 1's, minimizing loss +in the quantization step (but there is still information loss in subsampling, +as well as roundoff error). This setting is mainly of interest for +experimental purposes. Quality values above about 95 are NOT recommended for +normal use; the compressed file size goes up dramatically for hardly any gain +in output image quality. + +In the other direction, quality values below 50 will produce very small files +of low image quality. Settings around 5 to 10 might be useful in preparing an +index of a large image library, for example. Try -quality 2 (or so) for some +amusing Cubist effects. (Note: quality values below about 25 generate 2-byte +quantization tables, which are considered optional in the JPEG standard. +cjpeg emits a warning message when you give such a quality value, because some +other JPEG programs may be unable to decode the resulting file. Use -baseline +if you need to ensure compatibility at low quality values.) + +The -quality option has been extended in IJG version 7 for support of separate +quality settings for luminance and chrominance (or in general, for every +provided quantization table slot). This feature is useful for high-quality +applications which cannot accept the damage of color data by coarse +subsampling settings. You can now easily reduce the color data amount more +smoothly with finer control without separate subsampling. The resulting file +is fully compliant with standard JPEG decoders. +Note that the -quality ratings refer to the quantization table slots, and that +the last value is replicated if there are more q-table slots than parameters. +The default q-table slots are 0 for luminance and 1 for chrominance with +default tables as given in the JPEG standard. This is compatible with the old +behaviour in case that only one parameter is given, which is then used for +both luminance and chrominance (slots 0 and 1). More or custom quantization +tables can be set with -qtables and assigned to components with -qslots +parameter (see the "wizard" switches below). +CAUTION: You must explicitly add -sample 1x1 for efficient separate color +quality selection, since the default value used by library is 2x2! + +The -progressive switch creates a "progressive JPEG" file. In this type of +JPEG file, the data is stored in multiple scans of increasing quality. If the +file is being transmitted over a slow communications link, the decoder can use +the first scan to display a low-quality image very quickly, and can then +improve the display with each subsequent scan. The final image is exactly +equivalent to a standard JPEG file of the same quality setting, and the total +file size is about the same --- often a little smaller. + +Switches for advanced users: + + -block N Set DCT block size. All N from 1 to 16 are possible. + Default is 8 (baseline format). + Larger values produce higher compression, + smaller values produce higher quality + (exact DCT stage possible with 1 or 2; with the + default quality of 75 and default Luminance qtable + the DCT+Quantization stage is lossless for N=1). + CAUTION: An implementation of the JPEG SmartScale + extension is required for this feature. SmartScale + enabled JPEG is not yet widely implemented, so many + decoders will be unable to view a SmartScale extended + JPEG file at all. + + -dct int Use integer DCT method (default). + -dct fast Use fast integer DCT (less accurate). + -dct float Use floating-point DCT method. + The float method is very slightly more accurate than + the int method, but is much slower unless your machine + has very fast floating-point hardware. Also note that + results of the floating-point method may vary slightly + across machines, while the integer methods should give + the same results everywhere. The fast integer method + is much less accurate than the other two. + + -nosmooth Don't use high-quality downsampling. + + -restart N Emit a JPEG restart marker every N MCU rows, or every + N MCU blocks if "B" is attached to the number. + -restart 0 (the default) means no restart markers. + + -smooth N Smooth the input image to eliminate dithering noise. + N, ranging from 1 to 100, indicates the strength of + smoothing. 0 (the default) means no smoothing. + + -maxmemory N Set limit for amount of memory to use in processing + large images. Value is in thousands of bytes, or + millions of bytes if "M" is attached to the number. + For example, -max 4m selects 4000000 bytes. If more + space is needed, temporary files will be used. + + -verbose Enable debug printout. More -v's give more printout. + or -debug Also, version information is printed at startup. + +The -restart option inserts extra markers that allow a JPEG decoder to +resynchronize after a transmission error. Without restart markers, any damage +to a compressed file will usually ruin the image from the point of the error +to the end of the image; with restart markers, the damage is usually confined +to the portion of the image up to the next restart marker. Of course, the +restart markers occupy extra space. We recommend -restart 1 for images that +will be transmitted across unreliable networks such as Usenet. + +The -smooth option filters the input to eliminate fine-scale noise. This is +often useful when converting dithered images to JPEG: a moderate smoothing +factor of 10 to 50 gets rid of dithering patterns in the input file, resulting +in a smaller JPEG file and a better-looking image. Too large a smoothing +factor will visibly blur the image, however. + +Switches for wizards: + + -arithmetic Use arithmetic coding. CAUTION: arithmetic coded JPEG + is not yet widely implemented, so many decoders will + be unable to view an arithmetic coded JPEG file at + all. + + -baseline Force baseline-compatible quantization tables to be + generated. This clamps quantization values to 8 bits + even at low quality settings. (This switch is poorly + named, since it does not ensure that the output is + actually baseline JPEG. For example, you can use + -baseline and -progressive together.) + + -qtables file Use the quantization tables given in the specified + text file. + + -qslots N[,...] Select which quantization table to use for each color + component. + + -sample HxV[,...] Set JPEG sampling factors for each color component. + + -scans file Use the scan script given in the specified text file. + +The "wizard" switches are intended for experimentation with JPEG. If you +don't know what you are doing, DON'T USE THEM. These switches are documented +further in the file wizard.txt. + + +DJPEG DETAILS + +The basic command line switches for djpeg are: + + -colors N Reduce image to at most N colors. This reduces the + or -quantize N number of colors used in the output image, so that it + can be displayed on a colormapped display or stored in + a colormapped file format. For example, if you have + an 8-bit display, you'd need to reduce to 256 or fewer + colors. (-colors is the recommended name, -quantize + is provided only for backwards compatibility.) + + -fast Select recommended processing options for fast, low + quality output. (The default options are chosen for + highest quality output.) Currently, this is equivalent + to "-dct fast -nosmooth -onepass -dither ordered". + + -grayscale Force gray-scale output even if JPEG file is color. + Useful for viewing on monochrome displays; also, + djpeg runs noticeably faster in this mode. + + -scale M/N Scale the output image by a factor M/N. Currently + supported scale factors are M/N with all M from 1 to + 16, where N is the source DCT size, which is 8 for + baseline JPEG. If the /N part is omitted, then M + specifies the DCT scaled size to be applied on the + given input. For baseline JPEG this is equivalent to + M/8 scaling, since the source DCT size for baseline + JPEG is 8. Scaling is handy if the image is larger + than your screen; also, djpeg runs much faster when + scaling down the output. + + -bmp Select BMP output format (Windows flavor). 8-bit + colormapped format is emitted if -colors or -grayscale + is specified, or if the JPEG file is gray-scale; + otherwise, 24-bit full-color format is emitted. + + -gif Select GIF output format. Since GIF does not support + more than 256 colors, -colors 256 is assumed (unless + you specify a smaller number of colors). If you + specify -fast, the default number of colors is 216. + + -os2 Select BMP output format (OS/2 1.x flavor). 8-bit + colormapped format is emitted if -colors or -grayscale + is specified, or if the JPEG file is gray-scale; + otherwise, 24-bit full-color format is emitted. + + -pnm Select PBMPLUS (PPM/PGM) output format (this is the + default format). PGM is emitted if the JPEG file is + gray-scale or if -grayscale is specified; otherwise + PPM is emitted. + + -rle Select RLE output format. (Requires URT library.) + + -targa Select Targa output format. Gray-scale format is + emitted if the JPEG file is gray-scale or if + -grayscale is specified; otherwise, colormapped format + is emitted if -colors is specified; otherwise, 24-bit + full-color format is emitted. + +Switches for advanced users: + + -dct int Use integer DCT method (default). + -dct fast Use fast integer DCT (less accurate). + -dct float Use floating-point DCT method. + The float method is very slightly more accurate than + the int method, but is much slower unless your machine + has very fast floating-point hardware. Also note that + results of the floating-point method may vary slightly + across machines, while the integer methods should give + the same results everywhere. The fast integer method + is much less accurate than the other two. + + -dither fs Use Floyd-Steinberg dithering in color quantization. + -dither ordered Use ordered dithering in color quantization. + -dither none Do not use dithering in color quantization. + By default, Floyd-Steinberg dithering is applied when + quantizing colors; this is slow but usually produces + the best results. Ordered dither is a compromise + between speed and quality; no dithering is fast but + usually looks awful. Note that these switches have + no effect unless color quantization is being done. + Ordered dither is only available in -onepass mode. + + -map FILE Quantize to the colors used in the specified image + file. This is useful for producing multiple files + with identical color maps, or for forcing a predefined + set of colors to be used. The FILE must be a GIF + or PPM file. This option overrides -colors and + -onepass. + + -nosmooth Don't use high-quality upsampling. + + -onepass Use one-pass instead of two-pass color quantization. + The one-pass method is faster and needs less memory, + but it produces a lower-quality image. -onepass is + ignored unless you also say -colors N. Also, + the one-pass method is always used for gray-scale + output (the two-pass method is no improvement then). + + -maxmemory N Set limit for amount of memory to use in processing + large images. Value is in thousands of bytes, or + millions of bytes if "M" is attached to the number. + For example, -max 4m selects 4000000 bytes. If more + space is needed, temporary files will be used. + + -verbose Enable debug printout. More -v's give more printout. + or -debug Also, version information is printed at startup. + + +HINTS FOR CJPEG + +Color GIF files are not the ideal input for JPEG; JPEG is really intended for +compressing full-color (24-bit) images. In particular, don't try to convert +cartoons, line drawings, and other images that have only a few distinct +colors. GIF works great on these, JPEG does not. If you want to convert a +GIF to JPEG, you should experiment with cjpeg's -quality and -smooth options +to get a satisfactory conversion. -smooth 10 or so is often helpful. + +Avoid running an image through a series of JPEG compression/decompression +cycles. Image quality loss will accumulate; after ten or so cycles the image +may be noticeably worse than it was after one cycle. It's best to use a +lossless format while manipulating an image, then convert to JPEG format when +you are ready to file the image away. + +The -optimize option to cjpeg is worth using when you are making a "final" +version for posting or archiving. It's also a win when you are using low +quality settings to make very small JPEG files; the percentage improvement +is often a lot more than it is on larger files. (At present, -optimize +mode is always selected when generating progressive JPEG files.) + +GIF input files are no longer supported, to avoid the Unisys LZW patent. +(Conversion of GIF files to JPEG is usually a bad idea anyway.) + + +HINTS FOR DJPEG + +To get a quick preview of an image, use the -grayscale and/or -scale switches. +"-grayscale -scale 1/8" is the fastest case. + +Several options are available that trade off image quality to gain speed. +"-fast" turns on the recommended settings. + +"-dct fast" and/or "-nosmooth" gain speed at a small sacrifice in quality. +When producing a color-quantized image, "-onepass -dither ordered" is fast but +much lower quality than the default behavior. "-dither none" may give +acceptable results in two-pass mode, but is seldom tolerable in one-pass mode. + +If you are fortunate enough to have very fast floating point hardware, +"-dct float" may be even faster than "-dct fast". But on most machines +"-dct float" is slower than "-dct int"; in this case it is not worth using, +because its theoretical accuracy advantage is too small to be significant +in practice. + +Two-pass color quantization requires a good deal of memory; on MS-DOS machines +it may run out of memory even with -maxmemory 0. In that case you can still +decompress, with some loss of image quality, by specifying -onepass for +one-pass quantization. + +To avoid the Unisys LZW patent, djpeg produces uncompressed GIF files. These +are larger than they should be, but are readable by standard GIF decoders. + + +HINTS FOR BOTH PROGRAMS + +If more space is needed than will fit in the available main memory (as +determined by -maxmemory), temporary files will be used. (MS-DOS versions +will try to get extended or expanded memory first.) The temporary files are +often rather large: in typical cases they occupy three bytes per pixel, for +example 3*800*600 = 1.44Mb for an 800x600 image. If you don't have enough +free disk space, leave out -progressive and -optimize (for cjpeg) or specify +-onepass (for djpeg). + +On MS-DOS, the temporary files are created in the directory named by the TMP +or TEMP environment variable, or in the current directory if neither of those +exist. Amiga implementations put the temp files in the directory named by +JPEGTMP:, so be sure to assign JPEGTMP: to a disk partition with adequate free +space. + +The default memory usage limit (-maxmemory) is set when the software is +compiled. If you get an "insufficient memory" error, try specifying a smaller +-maxmemory value, even -maxmemory 0 to use the absolute minimum space. You +may want to recompile with a smaller default value if this happens often. + +On machines that have "environment" variables, you can define the environment +variable JPEGMEM to set the default memory limit. The value is specified as +described for the -maxmemory switch. JPEGMEM overrides the default value +specified when the program was compiled, and itself is overridden by an +explicit -maxmemory switch. + +On MS-DOS machines, -maxmemory is the amount of main (conventional) memory to +use. (Extended or expanded memory is also used if available.) Most +DOS-specific versions of this software do their own memory space estimation +and do not need you to specify -maxmemory. + + +JPEGTRAN + +jpegtran performs various useful transformations of JPEG files. +It can translate the coded representation from one variant of JPEG to another, +for example from baseline JPEG to progressive JPEG or vice versa. It can also +perform some rearrangements of the image data, for example turning an image +from landscape to portrait format by rotation. + +jpegtran works by rearranging the compressed data (DCT coefficients), without +ever fully decoding the image. Therefore, its transformations are lossless: +there is no image degradation at all, which would not be true if you used +djpeg followed by cjpeg to accomplish the same conversion. But by the same +token, jpegtran cannot perform lossy operations such as changing the image +quality. + +jpegtran uses a command line syntax similar to cjpeg or djpeg. +On Unix-like systems, you say: + jpegtran [switches] [inputfile] >outputfile +On most non-Unix systems, you say: + jpegtran [switches] inputfile outputfile +where both the input and output files are JPEG files. + +To specify the coded JPEG representation used in the output file, +jpegtran accepts a subset of the switches recognized by cjpeg: + -optimize Perform optimization of entropy encoding parameters. + -progressive Create progressive JPEG file. + -restart N Emit a JPEG restart marker every N MCU rows, or every + N MCU blocks if "B" is attached to the number. + -arithmetic Use arithmetic coding. + -scans file Use the scan script given in the specified text file. +See the previous discussion of cjpeg for more details about these switches. +If you specify none of these switches, you get a plain baseline-JPEG output +file. The quality setting and so forth are determined by the input file. + +The image can be losslessly transformed by giving one of these switches: + -flip horizontal Mirror image horizontally (left-right). + -flip vertical Mirror image vertically (top-bottom). + -rotate 90 Rotate image 90 degrees clockwise. + -rotate 180 Rotate image 180 degrees. + -rotate 270 Rotate image 270 degrees clockwise (or 90 ccw). + -transpose Transpose image (across UL-to-LR axis). + -transverse Transverse transpose (across UR-to-LL axis). + +The transpose transformation has no restrictions regarding image dimensions. +The other transformations operate rather oddly if the image dimensions are not +a multiple of the iMCU size (usually 8 or 16 pixels), because they can only +transform complete blocks of DCT coefficient data in the desired way. + +jpegtran's default behavior when transforming an odd-size image is designed +to preserve exact reversibility and mathematical consistency of the +transformation set. As stated, transpose is able to flip the entire image +area. Horizontal mirroring leaves any partial iMCU column at the right edge +untouched, but is able to flip all rows of the image. Similarly, vertical +mirroring leaves any partial iMCU row at the bottom edge untouched, but is +able to flip all columns. The other transforms can be built up as sequences +of transpose and flip operations; for consistency, their actions on edge +pixels are defined to be the same as the end result of the corresponding +transpose-and-flip sequence. + +For practical use, you may prefer to discard any untransformable edge pixels +rather than having a strange-looking strip along the right and/or bottom edges +of a transformed image. To do this, add the -trim switch: + -trim Drop non-transformable edge blocks. +Obviously, a transformation with -trim is not reversible, so strictly speaking +jpegtran with this switch is not lossless. Also, the expected mathematical +equivalences between the transformations no longer hold. For example, +"-rot 270 -trim" trims only the bottom edge, but "-rot 90 -trim" followed by +"-rot 180 -trim" trims both edges. + +If you are only interested in perfect transformation, add the -perfect switch: + -perfect Fails with an error if the transformation is not + perfect. +For example you may want to do + jpegtran -rot 90 -perfect foo.jpg || djpeg foo.jpg | pnmflip -r90 | cjpeg +to do a perfect rotation if available or an approximated one if not. + +We also offer a lossless-crop option, which discards data outside a given +image region but losslessly preserves what is inside. Like the rotate and +flip transforms, lossless crop is restricted by the current JPEG format: the +upper left corner of the selected region must fall on an iMCU boundary. If +this does not hold for the given crop parameters, we silently move the upper +left corner up and/or left to make it so, simultaneously increasing the region +dimensions to keep the lower right crop corner unchanged. (Thus, the output +image covers at least the requested region, but may cover more.) + +The image can be losslessly cropped by giving the switch: + -crop WxH+X+Y Crop to a rectangular subarea of width W, height H + starting at point X,Y. + +Other not-strictly-lossless transformation switches are: + + -grayscale Force grayscale output. +This option discards the chrominance channels if the input image is YCbCr +(ie, a standard color JPEG), resulting in a grayscale JPEG file. The +luminance channel is preserved exactly, so this is a better method of reducing +to grayscale than decompression, conversion, and recompression. This switch +is particularly handy for fixing a monochrome picture that was mistakenly +encoded as a color JPEG. (In such a case, the space savings from getting rid +of the near-empty chroma channels won't be large; but the decoding time for +a grayscale JPEG is substantially less than that for a color JPEG.) + + -scale M/N Scale the output image by a factor M/N. +Currently supported scale factors are M/N with all M from 1 to 16, where N is +the source DCT size, which is 8 for baseline JPEG. If the /N part is omitted, +then M specifies the DCT scaled size to be applied on the given input. For +baseline JPEG this is equivalent to M/8 scaling, since the source DCT size +for baseline JPEG is 8. CAUTION: An implementation of the JPEG SmartScale +extension is required for this feature. SmartScale enabled JPEG is not yet +widely implemented, so many decoders will be unable to view a SmartScale +extended JPEG file at all. + +jpegtran also recognizes these switches that control what to do with "extra" +markers, such as comment blocks: + -copy none Copy no extra markers from source file. This setting + suppresses all comments and other excess baggage + present in the source file. + -copy comments Copy only comment markers. This setting copies + comments from the source file, but discards + any other inessential (for image display) data. + -copy all Copy all extra markers. This setting preserves + miscellaneous markers found in the source file, such + as JFIF thumbnails, Exif data, and Photoshop settings. + In some files these extra markers can be sizable. +The default behavior is -copy comments. (Note: in IJG releases v6 and v6a, +jpegtran always did the equivalent of -copy none.) + +Additional switches recognized by jpegtran are: + -outfile filename + -maxmemory N + -verbose + -debug +These work the same as in cjpeg or djpeg. + + +THE COMMENT UTILITIES + +The JPEG standard allows "comment" (COM) blocks to occur within a JPEG file. +Although the standard doesn't actually define what COM blocks are for, they +are widely used to hold user-supplied text strings. This lets you add +annotations, titles, index terms, etc to your JPEG files, and later retrieve +them as text. COM blocks do not interfere with the image stored in the JPEG +file. The maximum size of a COM block is 64K, but you can have as many of +them as you like in one JPEG file. + +We provide two utility programs to display COM block contents and add COM +blocks to a JPEG file. + +rdjpgcom searches a JPEG file and prints the contents of any COM blocks on +standard output. The command line syntax is + rdjpgcom [-raw] [-verbose] [inputfilename] +The switch "-raw" (or just "-r") causes rdjpgcom to also output non-printable +characters in comments, which are normally escaped for security reasons. +The switch "-verbose" (or just "-v") causes rdjpgcom to also display the JPEG +image dimensions. If you omit the input file name from the command line, +the JPEG file is read from standard input. (This may not work on some +operating systems, if binary data can't be read from stdin.) + +wrjpgcom adds a COM block, containing text you provide, to a JPEG file. +Ordinarily, the COM block is added after any existing COM blocks, but you +can delete the old COM blocks if you wish. wrjpgcom produces a new JPEG +file; it does not modify the input file. DO NOT try to overwrite the input +file by directing wrjpgcom's output back into it; on most systems this will +just destroy your file. + +The command line syntax for wrjpgcom is similar to cjpeg's. On Unix-like +systems, it is + wrjpgcom [switches] [inputfilename] +The output file is written to standard output. The input file comes from +the named file, or from standard input if no input file is named. + +On most non-Unix systems, the syntax is + wrjpgcom [switches] inputfilename outputfilename +where both input and output file names must be given explicitly. + +wrjpgcom understands three switches: + -replace Delete any existing COM blocks from the file. + -comment "Comment text" Supply new COM text on command line. + -cfile name Read text for new COM block from named file. +(Switch names can be abbreviated.) If you have only one line of comment text +to add, you can provide it on the command line with -comment. The comment +text must be surrounded with quotes so that it is treated as a single +argument. Longer comments can be read from a text file. + +If you give neither -comment nor -cfile, then wrjpgcom will read the comment +text from standard input. (In this case an input image file name MUST be +supplied, so that the source JPEG file comes from somewhere else.) You can +enter multiple lines, up to 64KB worth. Type an end-of-file indicator +(usually control-D or control-Z) to terminate the comment text entry. + +wrjpgcom will not add a COM block if the provided comment string is empty. +Therefore -replace -comment "" can be used to delete all COM blocks from a +file. + +These utility programs do not depend on the IJG JPEG library. In +particular, the source code for rdjpgcom is intended as an illustration of +the minimum amount of code required to parse a JPEG file header correctly. diff --git a/jpeg-8c/wizard.txt b/jpeg-8c/wizard.txt new file mode 100644 index 00000000..54170b22 --- /dev/null +++ b/jpeg-8c/wizard.txt @@ -0,0 +1,211 @@ +Advanced usage instructions for the Independent JPEG Group's JPEG software +========================================================================== + +This file describes cjpeg's "switches for wizards". + +The "wizard" switches are intended for experimentation with JPEG by persons +who are reasonably knowledgeable about the JPEG standard. If you don't know +what you are doing, DON'T USE THESE SWITCHES. You'll likely produce files +with worse image quality and/or poorer compression than you'd get from the +default settings. Furthermore, these switches must be used with caution +when making files intended for general use, because not all JPEG decoders +will support unusual JPEG parameter settings. + + +Quantization Table Adjustment +----------------------------- + +Ordinarily, cjpeg starts with a default set of tables (the same ones given +as examples in the JPEG standard) and scales them up or down according to +the -quality setting. The details of the scaling algorithm can be found in +jcparam.c. At very low quality settings, some quantization table entries +can get scaled up to values exceeding 255. Although 2-byte quantization +values are supported by the IJG software, this feature is not in baseline +JPEG and is not supported by all implementations. If you need to ensure +wide compatibility of low-quality files, you can constrain the scaled +quantization values to no more than 255 by giving the -baseline switch. +Note that use of -baseline will result in poorer quality for the same file +size, since more bits than necessary are expended on higher AC coefficients. + +You can substitute a different set of quantization values by using the +-qtables switch: + + -qtables file Use the quantization tables given in the named file. + +The specified file should be a text file containing decimal quantization +values. The file should contain one to four tables, each of 64 elements. +The tables are implicitly numbered 0,1,etc. in order of appearance. Table +entries appear in normal array order (NOT in the zigzag order in which they +will be stored in the JPEG file). + +Quantization table files are free format, in that arbitrary whitespace can +appear between numbers. Also, comments can be included: a comment starts +with '#' and extends to the end of the line. Here is an example file that +duplicates the default quantization tables: + + # Quantization tables given in JPEG spec, section K.1 + + # This is table 0 (the luminance table): + 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 + + # This is table 1 (the chrominance table): + 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 + +If the -qtables switch is used without -quality, then the specified tables +are used exactly as-is. If both -qtables and -quality are used, then the +tables taken from the file are scaled in the same fashion that the default +tables would be scaled for that quality setting. If -baseline appears, then +the quantization values are constrained to the range 1-255. + +By default, cjpeg will use quantization table 0 for luminance components and +table 1 for chrominance components. To override this choice, use the -qslots +switch: + + -qslots N[,...] Select which quantization table to use for + each color component. + +The -qslots switch specifies a quantization table number for each color +component, in the order in which the components appear in the JPEG SOF marker. +For example, to create a separate table for each of Y,Cb,Cr, you could +provide a -qtables file that defines three quantization tables and say +"-qslots 0,1,2". If -qslots gives fewer table numbers than there are color +components, then the last table number is repeated as necessary. + + +Sampling Factor Adjustment +-------------------------- + +By default, cjpeg uses 2:1 horizontal and vertical downsampling when +compressing YCbCr data, and no downsampling for all other color spaces. +You can override this default with the -sample switch: + + -sample HxV[,...] Set JPEG sampling factors for each color + component. + +The -sample switch specifies the JPEG sampling factors for each color +component, in the order in which they appear in the JPEG SOF marker. +If you specify fewer HxV pairs than there are components, the remaining +components are set to 1x1 sampling. For example, the default YCbCr setting +is equivalent to "-sample 2x2,1x1,1x1", which can be abbreviated to +"-sample 2x2". + +There are still some JPEG decoders in existence that support only 2x1 +sampling (also called 4:2:2 sampling). Compatibility with such decoders can +be achieved by specifying "-sample 2x1". This is not recommended unless +really necessary, since it increases file size and encoding/decoding time +with very little quality gain. + + +Multiple Scan / Progression Control +----------------------------------- + +By default, cjpeg emits a single-scan sequential JPEG file. The +-progressive switch generates a progressive JPEG file using a default series +of progression parameters. You can create multiple-scan sequential JPEG +files or progressive JPEG files with custom progression parameters by using +the -scans switch: + + -scans file Use the scan sequence given in the named file. + +The specified file should be a text file containing a "scan script". +The script specifies the contents and ordering of the scans to be emitted. +Each entry in the script defines one scan. A scan definition specifies +the components to be included in the scan, and for progressive JPEG it also +specifies the progression parameters Ss,Se,Ah,Al for the scan. Scan +definitions are separated by semicolons (';'). A semicolon after the last +scan definition is optional. + +Each scan definition contains one to four component indexes, optionally +followed by a colon (':') and the four progressive-JPEG parameters. The +component indexes denote which color component(s) are to be transmitted in +the scan. Components are numbered in the order in which they appear in the +JPEG SOF marker, with the first component being numbered 0. (Note that these +indexes are not the "component ID" codes assigned to the components, just +positional indexes.) + +The progression parameters for each scan are: + Ss Zigzag index of first coefficient included in scan + Se Zigzag index of last coefficient included in scan + Ah Zero for first scan of a coefficient, else Al of prior scan + Al Successive approximation low bit position for scan +If the progression parameters are omitted, the values 0,63,0,0 are used, +producing a sequential JPEG file. cjpeg automatically determines whether +the script represents a progressive or sequential file, by observing whether +Ss and Se values other than 0 and 63 appear. (The -progressive switch is +not needed to specify this; in fact, it is ignored when -scans appears.) +The scan script must meet the JPEG restrictions on progression sequences. +(cjpeg checks that the spec's requirements are obeyed.) + +Scan script files are free format, in that arbitrary whitespace can appear +between numbers and around punctuation. Also, comments can be included: a +comment starts with '#' and extends to the end of the line. For additional +legibility, commas or dashes can be placed between values. (Actually, any +single punctuation character other than ':' or ';' can be inserted.) For +example, the following two scan definitions are equivalent: + 0 1 2: 0 63 0 0; + 0,1,2 : 0-63, 0,0 ; + +Here is an example of a scan script that generates a partially interleaved +sequential JPEG file: + + 0; # Y only in first scan + 1 2; # Cb and Cr in second scan + +Here is an example of a progressive scan script using only spectral selection +(no successive approximation): + + # Interleaved DC scan for Y,Cb,Cr: + 0,1,2: 0-0, 0, 0 ; + # AC scans: + 0: 1-2, 0, 0 ; # First two Y AC coefficients + 0: 3-5, 0, 0 ; # Three more + 1: 1-63, 0, 0 ; # All AC coefficients for Cb + 2: 1-63, 0, 0 ; # All AC coefficients for Cr + 0: 6-9, 0, 0 ; # More Y coefficients + 0: 10-63, 0, 0 ; # Remaining Y coefficients + +Here is an example of a successive-approximation script. This is equivalent +to the default script used by "cjpeg -progressive" for YCbCr images: + + # Initial DC scan for Y,Cb,Cr (lowest bit not sent) + 0,1,2: 0-0, 0, 1 ; + # First AC scan: send first 5 Y AC coefficients, minus 2 lowest bits: + 0: 1-5, 0, 2 ; + # Send all Cr,Cb AC coefficients, minus lowest bit: + # (chroma data is usually too small to be worth subdividing further; + # but note we send Cr first since eye is least sensitive to Cb) + 2: 1-63, 0, 1 ; + 1: 1-63, 0, 1 ; + # Send remaining Y AC coefficients, minus 2 lowest bits: + 0: 6-63, 0, 2 ; + # Send next-to-lowest bit of all Y AC coefficients: + 0: 1-63, 2, 1 ; + # At this point we've sent all but the lowest bit of all coefficients. + # Send lowest bit of DC coefficients + 0,1,2: 0-0, 1, 0 ; + # Send lowest bit of AC coefficients + 2: 1-63, 1, 0 ; + 1: 1-63, 1, 0 ; + # Y AC lowest bit scan is last; it's usually the largest scan + 0: 1-63, 1, 0 ; + +It may be worth pointing out that this script is tuned for quality settings +of around 50 to 75. For lower quality settings, you'd probably want to use +a script with fewer stages of successive approximation (otherwise the +initial scans will be really bad). For higher quality settings, you might +want to use more stages of successive approximation (so that the initial +scans are not too large). diff --git a/jpeg-8c/wrbmp.c b/jpeg-8c/wrbmp.c new file mode 100644 index 00000000..3283b0f1 --- /dev/null +++ b/jpeg-8c/wrbmp.c @@ -0,0 +1,442 @@ +/* + * wrbmp.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 routines to write output images in Microsoft "BMP" + * format (MS Windows 3.x and OS/2 1.x flavors). + * Either 8-bit colormapped or 24-bit full-color format can be written. + * No compression is supported. + * + * These routines may need modification for non-Unix environments or + * specialized applications. As they stand, they assume output to + * an ordinary stdio stream. + * + * This code contributed by James Arthur Boucher. + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ + +#ifdef BMP_SUPPORTED + + +/* + * To support 12-bit JPEG data, we'd have to scale output down to 8 bits. + * This is not yet implemented. + */ + +#if BITS_IN_JSAMPLE != 8 + Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */ +#endif + +/* + * Since BMP stores scanlines bottom-to-top, we have to invert the image + * from JPEG's top-to-bottom order. To do this, we save the outgoing data + * in a virtual array during put_pixel_row calls, then actually emit the + * BMP file during finish_output. The virtual array contains one JSAMPLE per + * pixel if the output is grayscale or colormapped, three if it is full color. + */ + +/* Private version of data destination object */ + +typedef struct { + struct djpeg_dest_struct pub; /* public fields */ + + boolean is_os2; /* saves the OS2 format request flag */ + + jvirt_sarray_ptr whole_image; /* needed to reverse row order */ + JDIMENSION data_width; /* JSAMPLEs per row */ + JDIMENSION row_width; /* physical width of one row in the BMP file */ + int pad_bytes; /* number of padding bytes needed per row */ + JDIMENSION cur_output_row; /* next row# to write to virtual array */ +} bmp_dest_struct; + +typedef bmp_dest_struct * bmp_dest_ptr; + + +/* Forward declarations */ +LOCAL(void) write_colormap + JPP((j_decompress_ptr cinfo, bmp_dest_ptr dest, + int map_colors, int map_entry_size)); + + +/* + * Write some pixel data. + * In this module rows_supplied will always be 1. + */ + +METHODDEF(void) +put_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, + JDIMENSION rows_supplied) +/* This version is for writing 24-bit pixels */ +{ + bmp_dest_ptr dest = (bmp_dest_ptr) dinfo; + JSAMPARRAY image_ptr; + register JSAMPROW inptr, outptr; + register JDIMENSION col; + int pad; + + /* Access next row in virtual array */ + image_ptr = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, dest->whole_image, + dest->cur_output_row, (JDIMENSION) 1, TRUE); + dest->cur_output_row++; + + /* Transfer data. Note destination values must be in BGR order + * (even though Microsoft's own documents say the opposite). + */ + inptr = dest->pub.buffer[0]; + outptr = image_ptr[0]; + for (col = cinfo->output_width; col > 0; col--) { + outptr[2] = *inptr++; /* can omit GETJSAMPLE() safely */ + outptr[1] = *inptr++; + outptr[0] = *inptr++; + outptr += 3; + } + + /* Zero out the pad bytes. */ + pad = dest->pad_bytes; + while (--pad >= 0) + *outptr++ = 0; +} + +METHODDEF(void) +put_gray_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, + JDIMENSION rows_supplied) +/* This version is for grayscale OR quantized color output */ +{ + bmp_dest_ptr dest = (bmp_dest_ptr) dinfo; + JSAMPARRAY image_ptr; + register JSAMPROW inptr, outptr; + register JDIMENSION col; + int pad; + + /* Access next row in virtual array */ + image_ptr = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, dest->whole_image, + dest->cur_output_row, (JDIMENSION) 1, TRUE); + dest->cur_output_row++; + + /* Transfer data. */ + inptr = dest->pub.buffer[0]; + outptr = image_ptr[0]; + for (col = cinfo->output_width; col > 0; col--) { + *outptr++ = *inptr++; /* can omit GETJSAMPLE() safely */ + } + + /* Zero out the pad bytes. */ + pad = dest->pad_bytes; + while (--pad >= 0) + *outptr++ = 0; +} + + +/* + * Startup: normally writes the file header. + * In this module we may as well postpone everything until finish_output. + */ + +METHODDEF(void) +start_output_bmp (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) +{ + /* no work here */ +} + + +/* + * Finish up at the end of the file. + * + * Here is where we really output the BMP file. + * + * First, routines to write the Windows and OS/2 variants of the file header. + */ + +LOCAL(void) +write_bmp_header (j_decompress_ptr cinfo, bmp_dest_ptr dest) +/* Write a Windows-style BMP file header, including colormap if needed */ +{ + char bmpfileheader[14]; + char bmpinfoheader[40]; +#define PUT_2B(array,offset,value) \ + (array[offset] = (char) ((value) & 0xFF), \ + array[offset+1] = (char) (((value) >> 8) & 0xFF)) +#define PUT_4B(array,offset,value) \ + (array[offset] = (char) ((value) & 0xFF), \ + array[offset+1] = (char) (((value) >> 8) & 0xFF), \ + array[offset+2] = (char) (((value) >> 16) & 0xFF), \ + array[offset+3] = (char) (((value) >> 24) & 0xFF)) + INT32 headersize, bfSize; + int bits_per_pixel, cmap_entries; + + /* Compute colormap size and total file size */ + if (cinfo->out_color_space == JCS_RGB) { + if (cinfo->quantize_colors) { + /* Colormapped RGB */ + bits_per_pixel = 8; + cmap_entries = 256; + } else { + /* Unquantized, full color RGB */ + bits_per_pixel = 24; + cmap_entries = 0; + } + } else { + /* Grayscale output. We need to fake a 256-entry colormap. */ + bits_per_pixel = 8; + cmap_entries = 256; + } + /* File size */ + headersize = 14 + 40 + cmap_entries * 4; /* Header and colormap */ + bfSize = headersize + (INT32) dest->row_width * (INT32) cinfo->output_height; + + /* Set unused fields of header to 0 */ + MEMZERO(bmpfileheader, SIZEOF(bmpfileheader)); + MEMZERO(bmpinfoheader, SIZEOF(bmpinfoheader)); + + /* Fill the file header */ + bmpfileheader[0] = 0x42; /* first 2 bytes are ASCII 'B', 'M' */ + bmpfileheader[1] = 0x4D; + PUT_4B(bmpfileheader, 2, bfSize); /* bfSize */ + /* we leave bfReserved1 & bfReserved2 = 0 */ + PUT_4B(bmpfileheader, 10, headersize); /* bfOffBits */ + + /* Fill the info header (Microsoft calls this a BITMAPINFOHEADER) */ + PUT_2B(bmpinfoheader, 0, 40); /* biSize */ + PUT_4B(bmpinfoheader, 4, cinfo->output_width); /* biWidth */ + PUT_4B(bmpinfoheader, 8, cinfo->output_height); /* biHeight */ + PUT_2B(bmpinfoheader, 12, 1); /* biPlanes - must be 1 */ + PUT_2B(bmpinfoheader, 14, bits_per_pixel); /* biBitCount */ + /* we leave biCompression = 0, for none */ + /* we leave biSizeImage = 0; this is correct for uncompressed data */ + if (cinfo->density_unit == 2) { /* if have density in dots/cm, then */ + PUT_4B(bmpinfoheader, 24, (INT32) (cinfo->X_density*100)); /* XPels/M */ + PUT_4B(bmpinfoheader, 28, (INT32) (cinfo->Y_density*100)); /* XPels/M */ + } + PUT_2B(bmpinfoheader, 32, cmap_entries); /* biClrUsed */ + /* we leave biClrImportant = 0 */ + + if (JFWRITE(dest->pub.output_file, bmpfileheader, 14) != (size_t) 14) + ERREXIT(cinfo, JERR_FILE_WRITE); + if (JFWRITE(dest->pub.output_file, bmpinfoheader, 40) != (size_t) 40) + ERREXIT(cinfo, JERR_FILE_WRITE); + + if (cmap_entries > 0) + write_colormap(cinfo, dest, cmap_entries, 4); +} + + +LOCAL(void) +write_os2_header (j_decompress_ptr cinfo, bmp_dest_ptr dest) +/* Write an OS2-style BMP file header, including colormap if needed */ +{ + char bmpfileheader[14]; + char bmpcoreheader[12]; + INT32 headersize, bfSize; + int bits_per_pixel, cmap_entries; + + /* Compute colormap size and total file size */ + if (cinfo->out_color_space == JCS_RGB) { + if (cinfo->quantize_colors) { + /* Colormapped RGB */ + bits_per_pixel = 8; + cmap_entries = 256; + } else { + /* Unquantized, full color RGB */ + bits_per_pixel = 24; + cmap_entries = 0; + } + } else { + /* Grayscale output. We need to fake a 256-entry colormap. */ + bits_per_pixel = 8; + cmap_entries = 256; + } + /* File size */ + headersize = 14 + 12 + cmap_entries * 3; /* Header and colormap */ + bfSize = headersize + (INT32) dest->row_width * (INT32) cinfo->output_height; + + /* Set unused fields of header to 0 */ + MEMZERO(bmpfileheader, SIZEOF(bmpfileheader)); + MEMZERO(bmpcoreheader, SIZEOF(bmpcoreheader)); + + /* Fill the file header */ + bmpfileheader[0] = 0x42; /* first 2 bytes are ASCII 'B', 'M' */ + bmpfileheader[1] = 0x4D; + PUT_4B(bmpfileheader, 2, bfSize); /* bfSize */ + /* we leave bfReserved1 & bfReserved2 = 0 */ + PUT_4B(bmpfileheader, 10, headersize); /* bfOffBits */ + + /* Fill the info header (Microsoft calls this a BITMAPCOREHEADER) */ + PUT_2B(bmpcoreheader, 0, 12); /* bcSize */ + PUT_2B(bmpcoreheader, 4, cinfo->output_width); /* bcWidth */ + PUT_2B(bmpcoreheader, 6, cinfo->output_height); /* bcHeight */ + PUT_2B(bmpcoreheader, 8, 1); /* bcPlanes - must be 1 */ + PUT_2B(bmpcoreheader, 10, bits_per_pixel); /* bcBitCount */ + + if (JFWRITE(dest->pub.output_file, bmpfileheader, 14) != (size_t) 14) + ERREXIT(cinfo, JERR_FILE_WRITE); + if (JFWRITE(dest->pub.output_file, bmpcoreheader, 12) != (size_t) 12) + ERREXIT(cinfo, JERR_FILE_WRITE); + + if (cmap_entries > 0) + write_colormap(cinfo, dest, cmap_entries, 3); +} + + +/* + * Write the colormap. + * Windows uses BGR0 map entries; OS/2 uses BGR entries. + */ + +LOCAL(void) +write_colormap (j_decompress_ptr cinfo, bmp_dest_ptr dest, + int map_colors, int map_entry_size) +{ + JSAMPARRAY colormap = cinfo->colormap; + int num_colors = cinfo->actual_number_of_colors; + FILE * outfile = dest->pub.output_file; + int i; + + if (colormap != NULL) { + if (cinfo->out_color_components == 3) { + /* Normal case with RGB colormap */ + for (i = 0; i < num_colors; i++) { + putc(GETJSAMPLE(colormap[2][i]), outfile); + putc(GETJSAMPLE(colormap[1][i]), outfile); + putc(GETJSAMPLE(colormap[0][i]), outfile); + if (map_entry_size == 4) + putc(0, outfile); + } + } else { + /* Grayscale colormap (only happens with grayscale quantization) */ + for (i = 0; i < num_colors; i++) { + putc(GETJSAMPLE(colormap[0][i]), outfile); + putc(GETJSAMPLE(colormap[0][i]), outfile); + putc(GETJSAMPLE(colormap[0][i]), outfile); + if (map_entry_size == 4) + putc(0, outfile); + } + } + } else { + /* If no colormap, must be grayscale data. Generate a linear "map". */ + for (i = 0; i < 256; i++) { + putc(i, outfile); + putc(i, outfile); + putc(i, outfile); + if (map_entry_size == 4) + putc(0, outfile); + } + } + /* Pad colormap with zeros to ensure specified number of colormap entries */ + if (i > map_colors) + ERREXIT1(cinfo, JERR_TOO_MANY_COLORS, i); + for (; i < map_colors; i++) { + putc(0, outfile); + putc(0, outfile); + putc(0, outfile); + if (map_entry_size == 4) + putc(0, outfile); + } +} + + +METHODDEF(void) +finish_output_bmp (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) +{ + bmp_dest_ptr dest = (bmp_dest_ptr) dinfo; + register FILE * outfile = dest->pub.output_file; + JSAMPARRAY image_ptr; + register JSAMPROW data_ptr; + JDIMENSION row; + register JDIMENSION col; + cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; + + /* Write the header and colormap */ + if (dest->is_os2) + write_os2_header(cinfo, dest); + else + write_bmp_header(cinfo, dest); + + /* Write the file body from our virtual array */ + for (row = cinfo->output_height; row > 0; row--) { + if (progress != NULL) { + progress->pub.pass_counter = (long) (cinfo->output_height - row); + progress->pub.pass_limit = (long) cinfo->output_height; + (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); + } + image_ptr = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, dest->whole_image, row-1, (JDIMENSION) 1, FALSE); + data_ptr = image_ptr[0]; + for (col = dest->row_width; col > 0; col--) { + putc(GETJSAMPLE(*data_ptr), outfile); + data_ptr++; + } + } + if (progress != NULL) + progress->completed_extra_passes++; + + /* Make sure we wrote the output file OK */ + fflush(outfile); + if (ferror(outfile)) + ERREXIT(cinfo, JERR_FILE_WRITE); +} + + +/* + * The module selection routine for BMP format output. + */ + +GLOBAL(djpeg_dest_ptr) +jinit_write_bmp (j_decompress_ptr cinfo, boolean is_os2) +{ + bmp_dest_ptr dest; + JDIMENSION row_width; + + /* Create module interface object, fill in method pointers */ + dest = (bmp_dest_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(bmp_dest_struct)); + dest->pub.start_output = start_output_bmp; + dest->pub.finish_output = finish_output_bmp; + dest->is_os2 = is_os2; + + if (cinfo->out_color_space == JCS_GRAYSCALE) { + dest->pub.put_pixel_rows = put_gray_rows; + } else if (cinfo->out_color_space == JCS_RGB) { + if (cinfo->quantize_colors) + dest->pub.put_pixel_rows = put_gray_rows; + else + dest->pub.put_pixel_rows = put_pixel_rows; + } else { + ERREXIT(cinfo, JERR_BMP_COLORSPACE); + } + + /* Calculate output image dimensions so we can allocate space */ + jpeg_calc_output_dimensions(cinfo); + + /* Determine width of rows in the BMP file (padded to 4-byte boundary). */ + row_width = cinfo->output_width * cinfo->output_components; + dest->data_width = row_width; + while ((row_width & 3) != 0) row_width++; + dest->row_width = row_width; + dest->pad_bytes = (int) (row_width - dest->data_width); + + /* Allocate space for inversion array, prepare for write pass */ + dest->whole_image = (*cinfo->mem->request_virt_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, + row_width, cinfo->output_height, (JDIMENSION) 1); + dest->cur_output_row = 0; + if (cinfo->progress != NULL) { + cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; + progress->total_extra_passes++; /* count file input as separate pass */ + } + + /* Create decompressor output buffer. */ + dest->pub.buffer = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, row_width, (JDIMENSION) 1); + dest->pub.buffer_height = 1; + + return (djpeg_dest_ptr) dest; +} + +#endif /* BMP_SUPPORTED */ diff --git a/jpeg-8c/wrgif.c b/jpeg-8c/wrgif.c new file mode 100644 index 00000000..5fe83283 --- /dev/null +++ b/jpeg-8c/wrgif.c @@ -0,0 +1,399 @@ +/* + * wrgif.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 routines to write output images in GIF format. + * + ************************************************************************** + * NOTE: to avoid entanglements with Unisys' patent on LZW compression, * + * this code has been modified to output "uncompressed GIF" files. * + * There is no trace of the LZW algorithm in this file. * + ************************************************************************** + * + * These routines may need modification for non-Unix environments or + * specialized applications. As they stand, they assume output to + * an ordinary stdio stream. + */ + +/* + * This code is loosely based on ppmtogif from the PBMPLUS distribution + * of Feb. 1991. That file contains the following copyright notice: + * Based on GIFENCODE by David Rowley . + * Lempel-Ziv compression based on "compress" by Spencer W. Thomas et al. + * Copyright (C) 1989 by Jef Poskanzer. + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. This software is provided "as is" without express or + * implied warranty. + * + * We are also required to state that + * "The Graphics Interchange Format(c) is the Copyright property of + * CompuServe Incorporated. GIF(sm) is a Service Mark property of + * CompuServe Incorporated." + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ + +#ifdef GIF_SUPPORTED + + +/* Private version of data destination object */ + +typedef struct { + struct djpeg_dest_struct pub; /* public fields */ + + j_decompress_ptr cinfo; /* back link saves passing separate parm */ + + /* State for packing variable-width codes into a bitstream */ + int n_bits; /* current number of bits/code */ + int maxcode; /* maximum code, given n_bits */ + INT32 cur_accum; /* holds bits not yet output */ + int cur_bits; /* # of bits in cur_accum */ + + /* State for GIF code assignment */ + int ClearCode; /* clear code (doesn't change) */ + int EOFCode; /* EOF code (ditto) */ + int code_counter; /* counts output symbols */ + + /* GIF data packet construction buffer */ + int bytesinpkt; /* # of bytes in current packet */ + char packetbuf[256]; /* workspace for accumulating packet */ + +} gif_dest_struct; + +typedef gif_dest_struct * gif_dest_ptr; + +/* Largest value that will fit in N bits */ +#define MAXCODE(n_bits) ((1 << (n_bits)) - 1) + + +/* + * Routines to package finished data bytes into GIF data blocks. + * A data block consists of a count byte (1..255) and that many data bytes. + */ + +LOCAL(void) +flush_packet (gif_dest_ptr dinfo) +/* flush any accumulated data */ +{ + if (dinfo->bytesinpkt > 0) { /* never write zero-length packet */ + dinfo->packetbuf[0] = (char) dinfo->bytesinpkt++; + if (JFWRITE(dinfo->pub.output_file, dinfo->packetbuf, dinfo->bytesinpkt) + != (size_t) dinfo->bytesinpkt) + ERREXIT(dinfo->cinfo, JERR_FILE_WRITE); + dinfo->bytesinpkt = 0; + } +} + + +/* Add a character to current packet; flush to disk if necessary */ +#define CHAR_OUT(dinfo,c) \ + { (dinfo)->packetbuf[++(dinfo)->bytesinpkt] = (char) (c); \ + if ((dinfo)->bytesinpkt >= 255) \ + flush_packet(dinfo); \ + } + + +/* Routine to convert variable-width codes into a byte stream */ + +LOCAL(void) +output (gif_dest_ptr dinfo, int code) +/* Emit a code of n_bits bits */ +/* Uses cur_accum and cur_bits to reblock into 8-bit bytes */ +{ + dinfo->cur_accum |= ((INT32) code) << dinfo->cur_bits; + dinfo->cur_bits += dinfo->n_bits; + + while (dinfo->cur_bits >= 8) { + CHAR_OUT(dinfo, dinfo->cur_accum & 0xFF); + dinfo->cur_accum >>= 8; + dinfo->cur_bits -= 8; + } +} + + +/* The pseudo-compression algorithm. + * + * In this module we simply output each pixel value as a separate symbol; + * thus, no compression occurs. In fact, there is expansion of one bit per + * pixel, because we use a symbol width one bit wider than the pixel width. + * + * GIF ordinarily uses variable-width symbols, and the decoder will expect + * to ratchet up the symbol width after a fixed number of symbols. + * To simplify the logic and keep the expansion penalty down, we emit a + * GIF Clear code to reset the decoder just before the width would ratchet up. + * Thus, all the symbols in the output file will have the same bit width. + * Note that emitting the Clear codes at the right times is a mere matter of + * counting output symbols and is in no way dependent on the LZW patent. + * + * With a small basic pixel width (low color count), Clear codes will be + * needed very frequently, causing the file to expand even more. So this + * simplistic approach wouldn't work too well on bilevel images, for example. + * But for output of JPEG conversions the pixel width will usually be 8 bits + * (129 to 256 colors), so the overhead added by Clear symbols is only about + * one symbol in every 256. + */ + +LOCAL(void) +compress_init (gif_dest_ptr dinfo, int i_bits) +/* Initialize pseudo-compressor */ +{ + /* init all the state variables */ + dinfo->n_bits = i_bits; + dinfo->maxcode = MAXCODE(dinfo->n_bits); + dinfo->ClearCode = (1 << (i_bits - 1)); + dinfo->EOFCode = dinfo->ClearCode + 1; + dinfo->code_counter = dinfo->ClearCode + 2; + /* init output buffering vars */ + dinfo->bytesinpkt = 0; + dinfo->cur_accum = 0; + dinfo->cur_bits = 0; + /* GIF specifies an initial Clear code */ + output(dinfo, dinfo->ClearCode); +} + + +LOCAL(void) +compress_pixel (gif_dest_ptr dinfo, int c) +/* Accept and "compress" one pixel value. + * The given value must be less than n_bits wide. + */ +{ + /* Output the given pixel value as a symbol. */ + output(dinfo, c); + /* Issue Clear codes often enough to keep the reader from ratcheting up + * its symbol size. + */ + if (dinfo->code_counter < dinfo->maxcode) { + dinfo->code_counter++; + } else { + output(dinfo, dinfo->ClearCode); + dinfo->code_counter = dinfo->ClearCode + 2; /* reset the counter */ + } +} + + +LOCAL(void) +compress_term (gif_dest_ptr dinfo) +/* Clean up at end */ +{ + /* Send an EOF code */ + output(dinfo, dinfo->EOFCode); + /* Flush the bit-packing buffer */ + if (dinfo->cur_bits > 0) { + CHAR_OUT(dinfo, dinfo->cur_accum & 0xFF); + } + /* Flush the packet buffer */ + flush_packet(dinfo); +} + + +/* GIF header construction */ + + +LOCAL(void) +put_word (gif_dest_ptr dinfo, unsigned int w) +/* Emit a 16-bit word, LSB first */ +{ + putc(w & 0xFF, dinfo->pub.output_file); + putc((w >> 8) & 0xFF, dinfo->pub.output_file); +} + + +LOCAL(void) +put_3bytes (gif_dest_ptr dinfo, int val) +/* Emit 3 copies of same byte value --- handy subr for colormap construction */ +{ + putc(val, dinfo->pub.output_file); + putc(val, dinfo->pub.output_file); + putc(val, dinfo->pub.output_file); +} + + +LOCAL(void) +emit_header (gif_dest_ptr dinfo, int num_colors, JSAMPARRAY colormap) +/* Output the GIF file header, including color map */ +/* If colormap==NULL, synthesize a gray-scale colormap */ +{ + int BitsPerPixel, ColorMapSize, InitCodeSize, FlagByte; + int cshift = dinfo->cinfo->data_precision - 8; + int i; + + if (num_colors > 256) + ERREXIT1(dinfo->cinfo, JERR_TOO_MANY_COLORS, num_colors); + /* Compute bits/pixel and related values */ + BitsPerPixel = 1; + while (num_colors > (1 << BitsPerPixel)) + BitsPerPixel++; + ColorMapSize = 1 << BitsPerPixel; + if (BitsPerPixel <= 1) + InitCodeSize = 2; + else + InitCodeSize = BitsPerPixel; + /* + * Write the GIF header. + * Note that we generate a plain GIF87 header for maximum compatibility. + */ + putc('G', dinfo->pub.output_file); + putc('I', dinfo->pub.output_file); + putc('F', dinfo->pub.output_file); + putc('8', dinfo->pub.output_file); + putc('7', dinfo->pub.output_file); + putc('a', dinfo->pub.output_file); + /* Write the Logical Screen Descriptor */ + put_word(dinfo, (unsigned int) dinfo->cinfo->output_width); + put_word(dinfo, (unsigned int) dinfo->cinfo->output_height); + FlagByte = 0x80; /* Yes, there is a global color table */ + FlagByte |= (BitsPerPixel-1) << 4; /* color resolution */ + FlagByte |= (BitsPerPixel-1); /* size of global color table */ + putc(FlagByte, dinfo->pub.output_file); + putc(0, dinfo->pub.output_file); /* Background color index */ + putc(0, dinfo->pub.output_file); /* Reserved (aspect ratio in GIF89) */ + /* Write the Global Color Map */ + /* If the color map is more than 8 bits precision, */ + /* we reduce it to 8 bits by shifting */ + for (i=0; i < ColorMapSize; i++) { + if (i < num_colors) { + if (colormap != NULL) { + if (dinfo->cinfo->out_color_space == JCS_RGB) { + /* Normal case: RGB color map */ + putc(GETJSAMPLE(colormap[0][i]) >> cshift, dinfo->pub.output_file); + putc(GETJSAMPLE(colormap[1][i]) >> cshift, dinfo->pub.output_file); + putc(GETJSAMPLE(colormap[2][i]) >> cshift, dinfo->pub.output_file); + } else { + /* Grayscale "color map": possible if quantizing grayscale image */ + put_3bytes(dinfo, GETJSAMPLE(colormap[0][i]) >> cshift); + } + } else { + /* Create a gray-scale map of num_colors values, range 0..255 */ + put_3bytes(dinfo, (i * 255 + (num_colors-1)/2) / (num_colors-1)); + } + } else { + /* fill out the map to a power of 2 */ + put_3bytes(dinfo, 0); + } + } + /* Write image separator and Image Descriptor */ + putc(',', dinfo->pub.output_file); /* separator */ + put_word(dinfo, 0); /* left/top offset */ + put_word(dinfo, 0); + put_word(dinfo, (unsigned int) dinfo->cinfo->output_width); /* image size */ + put_word(dinfo, (unsigned int) dinfo->cinfo->output_height); + /* flag byte: not interlaced, no local color map */ + putc(0x00, dinfo->pub.output_file); + /* Write Initial Code Size byte */ + putc(InitCodeSize, dinfo->pub.output_file); + + /* Initialize for "compression" of image data */ + compress_init(dinfo, InitCodeSize+1); +} + + +/* + * Startup: write the file header. + */ + +METHODDEF(void) +start_output_gif (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) +{ + gif_dest_ptr dest = (gif_dest_ptr) dinfo; + + if (cinfo->quantize_colors) + emit_header(dest, cinfo->actual_number_of_colors, cinfo->colormap); + else + emit_header(dest, 256, (JSAMPARRAY) NULL); +} + + +/* + * Write some pixel data. + * In this module rows_supplied will always be 1. + */ + +METHODDEF(void) +put_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, + JDIMENSION rows_supplied) +{ + gif_dest_ptr dest = (gif_dest_ptr) dinfo; + register JSAMPROW ptr; + register JDIMENSION col; + + ptr = dest->pub.buffer[0]; + for (col = cinfo->output_width; col > 0; col--) { + compress_pixel(dest, GETJSAMPLE(*ptr++)); + } +} + + +/* + * Finish up at the end of the file. + */ + +METHODDEF(void) +finish_output_gif (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) +{ + gif_dest_ptr dest = (gif_dest_ptr) dinfo; + + /* Flush "compression" mechanism */ + compress_term(dest); + /* Write a zero-length data block to end the series */ + putc(0, dest->pub.output_file); + /* Write the GIF terminator mark */ + putc(';', dest->pub.output_file); + /* Make sure we wrote the output file OK */ + fflush(dest->pub.output_file); + if (ferror(dest->pub.output_file)) + ERREXIT(cinfo, JERR_FILE_WRITE); +} + + +/* + * The module selection routine for GIF format output. + */ + +GLOBAL(djpeg_dest_ptr) +jinit_write_gif (j_decompress_ptr cinfo) +{ + gif_dest_ptr dest; + + /* Create module interface object, fill in method pointers */ + dest = (gif_dest_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(gif_dest_struct)); + dest->cinfo = cinfo; /* make back link for subroutines */ + dest->pub.start_output = start_output_gif; + dest->pub.put_pixel_rows = put_pixel_rows; + dest->pub.finish_output = finish_output_gif; + + if (cinfo->out_color_space != JCS_GRAYSCALE && + cinfo->out_color_space != JCS_RGB) + ERREXIT(cinfo, JERR_GIF_COLORSPACE); + + /* Force quantization if color or if > 8 bits input */ + if (cinfo->out_color_space != JCS_GRAYSCALE || cinfo->data_precision > 8) { + /* Force quantization to at most 256 colors */ + cinfo->quantize_colors = TRUE; + if (cinfo->desired_number_of_colors > 256) + cinfo->desired_number_of_colors = 256; + } + + /* Calculate output image dimensions so we can allocate space */ + jpeg_calc_output_dimensions(cinfo); + + if (cinfo->output_components != 1) /* safety check: just one component? */ + ERREXIT(cinfo, JERR_GIF_BUG); + + /* Create decompressor output buffer. */ + dest->pub.buffer = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, cinfo->output_width, (JDIMENSION) 1); + dest->pub.buffer_height = 1; + + return (djpeg_dest_ptr) dest; +} + +#endif /* GIF_SUPPORTED */ diff --git a/jpeg-8c/wrjpgcom b/jpeg-8c/wrjpgcom new file mode 100755 index 0000000000000000000000000000000000000000..ad8f5e053e94bcc502a4ac327f405524bc7ae509 GIT binary patch literal 26870 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 literal 0 HcmV?d00001 diff --git a/jpeg-8c/wrjpgcom.1 b/jpeg-8c/wrjpgcom.1 new file mode 100644 index 00000000..d419a999 --- /dev/null +++ b/jpeg-8c/wrjpgcom.1 @@ -0,0 +1,103 @@ +.TH WRJPGCOM 1 "15 June 1995" +.SH NAME +wrjpgcom \- insert text comments into a JPEG file +.SH SYNOPSIS +.B wrjpgcom +[ +.B \-replace +] +[ +.BI \-comment " text" +] +[ +.BI \-cfile " name" +] +[ +.I filename +] +.LP +.SH DESCRIPTION +.LP +.B wrjpgcom +reads the named JPEG/JFIF file, or the standard input if no file is named, +and generates a new JPEG/JFIF file on standard output. A comment block is +added to the file. +.PP +The JPEG standard allows "comment" (COM) blocks to occur within a JPEG file. +Although the standard doesn't actually define what COM blocks are for, they +are widely used to hold user-supplied text strings. This lets you add +annotations, titles, index terms, etc to your JPEG files, and later retrieve +them as text. COM blocks do not interfere with the image stored in the JPEG +file. The maximum size of a COM block is 64K, but you can have as many of +them as you like in one JPEG file. +.PP +.B wrjpgcom +adds a COM block, containing text you provide, to a JPEG file. +Ordinarily, the COM block is added after any existing COM blocks; but you +can delete the old COM blocks if you wish. +.SH OPTIONS +Switch names may be abbreviated, and are not case sensitive. +.TP +.B \-replace +Delete any existing COM blocks from the file. +.TP +.BI \-comment " text" +Supply text for new COM block on command line. +.TP +.BI \-cfile " name" +Read text for new COM block from named file. +.PP +If you have only one line of comment text to add, you can provide it on the +command line with +.BR \-comment . +The comment text must be surrounded with quotes so that it is treated as a +single argument. Longer comments can be read from a text file. +.PP +If you give neither +.B \-comment +nor +.BR \-cfile , +then +.B wrjpgcom +will read the comment text from standard input. (In this case an input image +file name MUST be supplied, so that the source JPEG file comes from somewhere +else.) You can enter multiple lines, up to 64KB worth. Type an end-of-file +indicator (usually control-D) to terminate the comment text entry. +.PP +.B wrjpgcom +will not add a COM block if the provided comment string is empty. Therefore +\fB\-replace \-comment ""\fR can be used to delete all COM blocks from a file. +.SH EXAMPLES +.LP +Add a short comment to in.jpg, producing out.jpg: +.IP +.B wrjpgcom \-c +\fI"View of my back yard" in.jpg +.B > +.I out.jpg +.PP +Attach a long comment previously stored in comment.txt: +.IP +.B wrjpgcom +.I in.jpg +.B < +.I comment.txt +.B > +.I out.jpg +.PP +or equivalently +.IP +.B wrjpgcom +.B -cfile +.I comment.txt +.B < +.I in.jpg +.B > +.I out.jpg +.SH SEE ALSO +.BR cjpeg (1), +.BR djpeg (1), +.BR jpegtran (1), +.BR rdjpgcom (1) +.SH AUTHOR +Independent JPEG Group diff --git a/jpeg-8c/wrjpgcom.c b/jpeg-8c/wrjpgcom.c new file mode 100644 index 00000000..8c04b055 --- /dev/null +++ b/jpeg-8c/wrjpgcom.c @@ -0,0 +1,583 @@ +/* + * wrjpgcom.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 a very simple stand-alone application that inserts + * user-supplied text as a COM (comment) marker in a JFIF file. + * This may be useful as an example of the minimum logic needed to parse + * JPEG markers. + */ + +#define JPEG_CJPEG_DJPEG /* to get the command-line config symbols */ +#include "jinclude.h" /* get auto-config symbols, */ + +#ifndef HAVE_STDLIB_H /* should declare malloc() */ +extern void * malloc (); +#endif +#include /* to declare isupper(), tolower() */ +#ifdef USE_SETMODE +#include /* to declare setmode()'s parameter macros */ +/* If you have setmode() but not , just delete this line: */ +#include /* to declare setmode() */ +#endif + +#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ +#ifdef __MWERKS__ +#include /* Metrowerks needs this */ +#include /* ... and this */ +#endif +#ifdef THINK_C +#include /* Think declares it here */ +#endif +#endif + +#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */ +#define READ_BINARY "r" +#define WRITE_BINARY "w" +#else +#ifdef VMS /* VMS is very nonstandard */ +#define READ_BINARY "rb", "ctx=stm" +#define WRITE_BINARY "wb", "ctx=stm" +#else /* standard ANSI-compliant case */ +#define READ_BINARY "rb" +#define WRITE_BINARY "wb" +#endif +#endif + +#ifndef EXIT_FAILURE /* define exit() codes if not provided */ +#define EXIT_FAILURE 1 +#endif +#ifndef EXIT_SUCCESS +#ifdef VMS +#define EXIT_SUCCESS 1 /* VMS is very nonstandard */ +#else +#define EXIT_SUCCESS 0 +#endif +#endif + +/* Reduce this value if your malloc() can't allocate blocks up to 64K. + * On DOS, compiling in large model is usually a better solution. + */ + +#ifndef MAX_COM_LENGTH +#define MAX_COM_LENGTH 65000L /* must be <= 65533 in any case */ +#endif + + +/* + * These macros are used to read the input file and write the output file. + * To reuse this code in another application, you might need to change these. + */ + +static FILE * infile; /* input JPEG file */ + +/* Return next input byte, or EOF if no more */ +#define NEXTBYTE() getc(infile) + +static FILE * outfile; /* output JPEG file */ + +/* Emit an output byte */ +#define PUTBYTE(x) putc((x), outfile) + + +/* Error exit handler */ +#define ERREXIT(msg) (fprintf(stderr, "%s\n", msg), exit(EXIT_FAILURE)) + + +/* Read one byte, testing for EOF */ +static int +read_1_byte (void) +{ + int c; + + c = NEXTBYTE(); + if (c == EOF) + ERREXIT("Premature EOF in JPEG file"); + return c; +} + +/* Read 2 bytes, convert to unsigned int */ +/* All 2-byte quantities in JPEG markers are MSB first */ +static unsigned int +read_2_bytes (void) +{ + int c1, c2; + + c1 = NEXTBYTE(); + if (c1 == EOF) + ERREXIT("Premature EOF in JPEG file"); + c2 = NEXTBYTE(); + if (c2 == EOF) + ERREXIT("Premature EOF in JPEG file"); + return (((unsigned int) c1) << 8) + ((unsigned int) c2); +} + + +/* Routines to write data to output file */ + +static void +write_1_byte (int c) +{ + PUTBYTE(c); +} + +static void +write_2_bytes (unsigned int val) +{ + PUTBYTE((val >> 8) & 0xFF); + PUTBYTE(val & 0xFF); +} + +static void +write_marker (int marker) +{ + PUTBYTE(0xFF); + PUTBYTE(marker); +} + +static void +copy_rest_of_file (void) +{ + int c; + + while ((c = NEXTBYTE()) != EOF) + PUTBYTE(c); +} + + +/* + * JPEG markers consist of one or more 0xFF bytes, followed by a marker + * code byte (which is not an FF). Here are the marker codes of interest + * in this program. (See jdmarker.c for a more complete list.) + */ + +#define M_SOF0 0xC0 /* Start Of Frame N */ +#define M_SOF1 0xC1 /* N indicates which compression process */ +#define M_SOF2 0xC2 /* Only SOF0-SOF2 are now in common use */ +#define M_SOF3 0xC3 +#define M_SOF5 0xC5 /* NB: codes C4 and CC are NOT SOF markers */ +#define M_SOF6 0xC6 +#define M_SOF7 0xC7 +#define M_SOF9 0xC9 +#define M_SOF10 0xCA +#define M_SOF11 0xCB +#define M_SOF13 0xCD +#define M_SOF14 0xCE +#define M_SOF15 0xCF +#define M_SOI 0xD8 /* Start Of Image (beginning of datastream) */ +#define M_EOI 0xD9 /* End Of Image (end of datastream) */ +#define M_SOS 0xDA /* Start Of Scan (begins compressed data) */ +#define M_COM 0xFE /* COMment */ + + +/* + * Find the next JPEG marker and return its marker code. + * We expect at least one FF byte, possibly more if the compressor used FFs + * to pad the file. (Padding FFs will NOT be replicated in the output file.) + * There could also be non-FF garbage between markers. The treatment of such + * garbage is unspecified; we choose to skip over it but emit a warning msg. + * NB: this routine must not be used after seeing SOS marker, since it will + * not deal correctly with FF/00 sequences in the compressed image data... + */ + +static int +next_marker (void) +{ + int c; + int discarded_bytes = 0; + + /* Find 0xFF byte; count and skip any non-FFs. */ + c = read_1_byte(); + while (c != 0xFF) { + discarded_bytes++; + c = read_1_byte(); + } + /* Get marker code byte, swallowing any duplicate FF bytes. Extra FFs + * are legal as pad bytes, so don't count them in discarded_bytes. + */ + do { + c = read_1_byte(); + } while (c == 0xFF); + + if (discarded_bytes != 0) { + fprintf(stderr, "Warning: garbage data found in JPEG file\n"); + } + + return c; +} + + +/* + * Read the initial marker, which should be SOI. + * For a JFIF file, the first two bytes of the file should be literally + * 0xFF M_SOI. To be more general, we could use next_marker, but if the + * input file weren't actually JPEG at all, next_marker might read the whole + * file and then return a misleading error message... + */ + +static int +first_marker (void) +{ + int c1, c2; + + c1 = NEXTBYTE(); + c2 = NEXTBYTE(); + if (c1 != 0xFF || c2 != M_SOI) + ERREXIT("Not a JPEG file"); + return c2; +} + + +/* + * Most types of marker are followed by a variable-length parameter segment. + * This routine skips over the parameters for any marker we don't otherwise + * want to process. + * Note that we MUST skip the parameter segment explicitly in order not to + * be fooled by 0xFF bytes that might appear within the parameter segment; + * such bytes do NOT introduce new markers. + */ + +static void +copy_variable (void) +/* Copy an unknown or uninteresting variable-length marker */ +{ + unsigned int length; + + /* Get the marker parameter length count */ + length = read_2_bytes(); + write_2_bytes(length); + /* Length includes itself, so must be at least 2 */ + if (length < 2) + ERREXIT("Erroneous JPEG marker length"); + length -= 2; + /* Skip over the remaining bytes */ + while (length > 0) { + write_1_byte(read_1_byte()); + length--; + } +} + +static void +skip_variable (void) +/* Skip over an unknown or uninteresting variable-length marker */ +{ + unsigned int length; + + /* Get the marker parameter length count */ + length = read_2_bytes(); + /* Length includes itself, so must be at least 2 */ + if (length < 2) + ERREXIT("Erroneous JPEG marker length"); + length -= 2; + /* Skip over the remaining bytes */ + while (length > 0) { + (void) read_1_byte(); + length--; + } +} + + +/* + * Parse the marker stream until SOFn or EOI is seen; + * copy data to output, but discard COM markers unless keep_COM is true. + */ + +static int +scan_JPEG_header (int keep_COM) +{ + int marker; + + /* Expect SOI at start of file */ + if (first_marker() != M_SOI) + ERREXIT("Expected SOI marker first"); + write_marker(M_SOI); + + /* Scan miscellaneous markers until we reach SOFn. */ + for (;;) { + marker = next_marker(); + switch (marker) { + /* Note that marker codes 0xC4, 0xC8, 0xCC are not, and must not be, + * treated as SOFn. C4 in particular is actually DHT. + */ + case M_SOF0: /* Baseline */ + case M_SOF1: /* Extended sequential, Huffman */ + case M_SOF2: /* Progressive, Huffman */ + 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_SOF9: /* Extended sequential, arithmetic */ + case M_SOF10: /* Progressive, arithmetic */ + case M_SOF11: /* Lossless, arithmetic */ + case M_SOF13: /* Differential sequential, arithmetic */ + case M_SOF14: /* Differential progressive, arithmetic */ + case M_SOF15: /* Differential lossless, arithmetic */ + return marker; + + case M_SOS: /* should not see compressed data before SOF */ + ERREXIT("SOS without prior SOFn"); + break; + + case M_EOI: /* in case it's a tables-only JPEG stream */ + return marker; + + case M_COM: /* Existing COM: conditionally discard */ + if (keep_COM) { + write_marker(marker); + copy_variable(); + } else { + skip_variable(); + } + break; + + default: /* Anything else just gets copied */ + write_marker(marker); + copy_variable(); /* we assume it has a parameter count... */ + break; + } + } /* end loop */ +} + + +/* Command line parsing code */ + +static const char * progname; /* program name for error messages */ + + +static void +usage (void) +/* complain about bad command line */ +{ + fprintf(stderr, "wrjpgcom inserts a textual comment in a JPEG file.\n"); + fprintf(stderr, "You can add to or replace any existing comment(s).\n"); + + fprintf(stderr, "Usage: %s [switches] ", progname); +#ifdef TWO_FILE_COMMANDLINE + fprintf(stderr, "inputfile outputfile\n"); +#else + fprintf(stderr, "[inputfile]\n"); +#endif + + fprintf(stderr, "Switches (names may be abbreviated):\n"); + fprintf(stderr, " -replace Delete any existing comments\n"); + fprintf(stderr, " -comment \"text\" Insert comment with given text\n"); + fprintf(stderr, " -cfile name Read comment from named file\n"); + fprintf(stderr, "Notice that you must put quotes around the comment text\n"); + fprintf(stderr, "when you use -comment.\n"); + fprintf(stderr, "If you do not give either -comment or -cfile on the command line,\n"); + fprintf(stderr, "then the comment text is read from standard input.\n"); + fprintf(stderr, "It can be multiple lines, up to %u characters total.\n", + (unsigned int) MAX_COM_LENGTH); +#ifndef TWO_FILE_COMMANDLINE + fprintf(stderr, "You must specify an input JPEG file name when supplying\n"); + fprintf(stderr, "comment text from standard input.\n"); +#endif + + exit(EXIT_FAILURE); +} + + +static int +keymatch (char * arg, const char * keyword, int minchars) +/* Case-insensitive matching of (possibly abbreviated) keyword switches. */ +/* keyword is the constant keyword (must be lower case already), */ +/* minchars is length of minimum legal abbreviation. */ +{ + register int ca, ck; + register int nmatched = 0; + + while ((ca = *arg++) != '\0') { + if ((ck = *keyword++) == '\0') + return 0; /* arg longer than keyword, no good */ + if (isupper(ca)) /* force arg to lcase (assume ck is already) */ + ca = tolower(ca); + if (ca != ck) + return 0; /* no good */ + nmatched++; /* count matched characters */ + } + /* reached end of argument; fail if it's too short for unique abbrev */ + if (nmatched < minchars) + return 0; + return 1; /* A-OK */ +} + + +/* + * The main program. + */ + +int +main (int argc, char **argv) +{ + int argn; + char * arg; + int keep_COM = 1; + char * comment_arg = NULL; + FILE * comment_file = NULL; + unsigned int comment_length = 0; + int marker; + + /* On Mac, fetch a command line. */ +#ifdef USE_CCOMMAND + argc = ccommand(&argv); +#endif + + progname = argv[0]; + if (progname == NULL || progname[0] == 0) + progname = "wrjpgcom"; /* in case C library doesn't provide it */ + + /* Parse switches, if any */ + for (argn = 1; argn < argc; argn++) { + arg = argv[argn]; + if (arg[0] != '-') + break; /* not switch, must be file name */ + arg++; /* advance over '-' */ + if (keymatch(arg, "replace", 1)) { + keep_COM = 0; + } else if (keymatch(arg, "cfile", 2)) { + if (++argn >= argc) usage(); + if ((comment_file = fopen(argv[argn], "r")) == NULL) { + fprintf(stderr, "%s: can't open %s\n", progname, argv[argn]); + exit(EXIT_FAILURE); + } + } else if (keymatch(arg, "comment", 1)) { + if (++argn >= argc) usage(); + comment_arg = argv[argn]; + /* If the comment text starts with '"', then we are probably running + * under MS-DOG and must parse out the quoted string ourselves. Sigh. + */ + if (comment_arg[0] == '"') { + comment_arg = (char *) malloc((size_t) MAX_COM_LENGTH); + if (comment_arg == NULL) + ERREXIT("Insufficient memory"); + strcpy(comment_arg, argv[argn]+1); + for (;;) { + comment_length = (unsigned int) strlen(comment_arg); + if (comment_length > 0 && comment_arg[comment_length-1] == '"') { + comment_arg[comment_length-1] = '\0'; /* zap terminating quote */ + break; + } + if (++argn >= argc) + ERREXIT("Missing ending quote mark"); + strcat(comment_arg, " "); + strcat(comment_arg, argv[argn]); + } + } + comment_length = (unsigned int) strlen(comment_arg); + } else + usage(); + } + + /* Cannot use both -comment and -cfile. */ + if (comment_arg != NULL && comment_file != NULL) + usage(); + /* If there is neither -comment nor -cfile, we will read the comment text + * from stdin; in this case there MUST be an input JPEG file name. + */ + if (comment_arg == NULL && comment_file == NULL && argn >= argc) + usage(); + + /* Open the input file. */ + if (argn < argc) { + if ((infile = fopen(argv[argn], READ_BINARY)) == NULL) { + fprintf(stderr, "%s: can't open %s\n", progname, argv[argn]); + exit(EXIT_FAILURE); + } + } else { + /* default input file is stdin */ +#ifdef USE_SETMODE /* need to hack file mode? */ + setmode(fileno(stdin), O_BINARY); +#endif +#ifdef USE_FDOPEN /* need to re-open in binary mode? */ + if ((infile = fdopen(fileno(stdin), READ_BINARY)) == NULL) { + fprintf(stderr, "%s: can't open stdin\n", progname); + exit(EXIT_FAILURE); + } +#else + infile = stdin; +#endif + } + + /* Open the output file. */ +#ifdef TWO_FILE_COMMANDLINE + /* Must have explicit output file name */ + if (argn != argc-2) { + fprintf(stderr, "%s: must name one input and one output file\n", + progname); + usage(); + } + if ((outfile = fopen(argv[argn+1], WRITE_BINARY)) == NULL) { + fprintf(stderr, "%s: can't open %s\n", progname, argv[argn+1]); + exit(EXIT_FAILURE); + } +#else + /* Unix style: expect zero or one file name */ + if (argn < argc-1) { + fprintf(stderr, "%s: only one input file\n", progname); + usage(); + } + /* default output file is stdout */ +#ifdef USE_SETMODE /* need to hack file mode? */ + setmode(fileno(stdout), O_BINARY); +#endif +#ifdef USE_FDOPEN /* need to re-open in binary mode? */ + if ((outfile = fdopen(fileno(stdout), WRITE_BINARY)) == NULL) { + fprintf(stderr, "%s: can't open stdout\n", progname); + exit(EXIT_FAILURE); + } +#else + outfile = stdout; +#endif +#endif /* TWO_FILE_COMMANDLINE */ + + /* Collect comment text from comment_file or stdin, if necessary */ + if (comment_arg == NULL) { + FILE * src_file; + int c; + + comment_arg = (char *) malloc((size_t) MAX_COM_LENGTH); + if (comment_arg == NULL) + ERREXIT("Insufficient memory"); + comment_length = 0; + src_file = (comment_file != NULL ? comment_file : stdin); + while ((c = getc(src_file)) != EOF) { + if (comment_length >= (unsigned int) MAX_COM_LENGTH) { + fprintf(stderr, "Comment text may not exceed %u bytes\n", + (unsigned int) MAX_COM_LENGTH); + exit(EXIT_FAILURE); + } + comment_arg[comment_length++] = (char) c; + } + if (comment_file != NULL) + fclose(comment_file); + } + + /* Copy JPEG headers until SOFn marker; + * we will insert the new comment marker just before SOFn. + * This (a) causes the new comment to appear after, rather than before, + * existing comments; and (b) ensures that comments come after any JFIF + * or JFXX markers, as required by the JFIF specification. + */ + marker = scan_JPEG_header(keep_COM); + /* Insert the new COM marker, but only if nonempty text has been supplied */ + if (comment_length > 0) { + write_marker(M_COM); + write_2_bytes(comment_length + 2); + while (comment_length > 0) { + write_1_byte(*comment_arg++); + comment_length--; + } + } + /* Duplicate the remainder of the source file. + * Note that any COM markers occuring after SOF will not be touched. + */ + write_marker(marker); + copy_rest_of_file(); + + /* All done. */ + exit(EXIT_SUCCESS); + return 0; /* suppress no-return-value warnings */ +} diff --git a/jpeg-8c/wrppm.c b/jpeg-8c/wrppm.c new file mode 100644 index 00000000..68e0c85c --- /dev/null +++ b/jpeg-8c/wrppm.c @@ -0,0 +1,269 @@ +/* + * wrppm.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * 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 output images in PPM/PGM format. + * The extended 2-byte-per-sample raw PPM/PGM formats are supported. + * The PBMPLUS library is NOT required to compile this software + * (but it is highly useful as a set of PPM image manipulation programs). + * + * These routines may need modification for non-Unix environments or + * specialized applications. As they stand, they assume output to + * an ordinary stdio stream. + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ + +#ifdef PPM_SUPPORTED + + +/* + * For 12-bit JPEG data, we either downscale the values to 8 bits + * (to write standard byte-per-sample PPM/PGM files), or output + * nonstandard word-per-sample PPM/PGM files. Downscaling is done + * if PPM_NORAWWORD is defined (this can be done in the Makefile + * or in jconfig.h). + * (When the core library supports data precision reduction, a cleaner + * implementation will be to ask for that instead.) + */ + +#if BITS_IN_JSAMPLE == 8 +#define PUTPPMSAMPLE(ptr,v) *ptr++ = (char) (v) +#define BYTESPERSAMPLE 1 +#define PPM_MAXVAL 255 +#else +#ifdef PPM_NORAWWORD +#define PUTPPMSAMPLE(ptr,v) *ptr++ = (char) ((v) >> (BITS_IN_JSAMPLE-8)) +#define BYTESPERSAMPLE 1 +#define PPM_MAXVAL 255 +#else +/* The word-per-sample format always puts the MSB first. */ +#define PUTPPMSAMPLE(ptr,v) \ + { register int val_ = v; \ + *ptr++ = (char) ((val_ >> 8) & 0xFF); \ + *ptr++ = (char) (val_ & 0xFF); \ + } +#define BYTESPERSAMPLE 2 +#define PPM_MAXVAL ((1<pub.output_file, dest->iobuffer, dest->buffer_width); +} + + +/* + * This code is used when we have to copy the data and apply a pixel + * format translation. Typically this only happens in 12-bit mode. + */ + +METHODDEF(void) +copy_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, + JDIMENSION rows_supplied) +{ + ppm_dest_ptr dest = (ppm_dest_ptr) dinfo; + register char * bufferptr; + register JSAMPROW ptr; + register JDIMENSION col; + + ptr = dest->pub.buffer[0]; + bufferptr = dest->iobuffer; + for (col = dest->samples_per_row; col > 0; col--) { + PUTPPMSAMPLE(bufferptr, GETJSAMPLE(*ptr++)); + } + (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); +} + + +/* + * Write some pixel data when color quantization is in effect. + * We have to demap the color index values to straight data. + */ + +METHODDEF(void) +put_demapped_rgb (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, + JDIMENSION rows_supplied) +{ + ppm_dest_ptr dest = (ppm_dest_ptr) dinfo; + register char * bufferptr; + register int pixval; + register JSAMPROW ptr; + register JSAMPROW color_map0 = cinfo->colormap[0]; + register JSAMPROW color_map1 = cinfo->colormap[1]; + register JSAMPROW color_map2 = cinfo->colormap[2]; + register JDIMENSION col; + + ptr = dest->pub.buffer[0]; + bufferptr = dest->iobuffer; + for (col = cinfo->output_width; col > 0; col--) { + pixval = GETJSAMPLE(*ptr++); + PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map0[pixval])); + PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map1[pixval])); + PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map2[pixval])); + } + (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); +} + + +METHODDEF(void) +put_demapped_gray (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, + JDIMENSION rows_supplied) +{ + ppm_dest_ptr dest = (ppm_dest_ptr) dinfo; + register char * bufferptr; + register JSAMPROW ptr; + register JSAMPROW color_map = cinfo->colormap[0]; + register JDIMENSION col; + + ptr = dest->pub.buffer[0]; + bufferptr = dest->iobuffer; + for (col = cinfo->output_width; col > 0; col--) { + PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map[GETJSAMPLE(*ptr++)])); + } + (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); +} + + +/* + * Startup: write the file header. + */ + +METHODDEF(void) +start_output_ppm (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) +{ + ppm_dest_ptr dest = (ppm_dest_ptr) dinfo; + + /* Emit file header */ + switch (cinfo->out_color_space) { + case JCS_GRAYSCALE: + /* emit header for raw PGM format */ + fprintf(dest->pub.output_file, "P5\n%ld %ld\n%d\n", + (long) cinfo->output_width, (long) cinfo->output_height, + PPM_MAXVAL); + break; + case JCS_RGB: + /* emit header for raw PPM format */ + fprintf(dest->pub.output_file, "P6\n%ld %ld\n%d\n", + (long) cinfo->output_width, (long) cinfo->output_height, + PPM_MAXVAL); + break; + default: + ERREXIT(cinfo, JERR_PPM_COLORSPACE); + } +} + + +/* + * Finish up at the end of the file. + */ + +METHODDEF(void) +finish_output_ppm (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) +{ + /* Make sure we wrote the output file OK */ + fflush(dinfo->output_file); + if (ferror(dinfo->output_file)) + ERREXIT(cinfo, JERR_FILE_WRITE); +} + + +/* + * The module selection routine for PPM format output. + */ + +GLOBAL(djpeg_dest_ptr) +jinit_write_ppm (j_decompress_ptr cinfo) +{ + ppm_dest_ptr dest; + + /* Create module interface object, fill in method pointers */ + dest = (ppm_dest_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(ppm_dest_struct)); + dest->pub.start_output = start_output_ppm; + dest->pub.finish_output = finish_output_ppm; + + /* Calculate output image dimensions so we can allocate space */ + jpeg_calc_output_dimensions(cinfo); + + /* Create physical I/O buffer. Note we make this near on a PC. */ + dest->samples_per_row = cinfo->output_width * cinfo->out_color_components; + dest->buffer_width = dest->samples_per_row * (BYTESPERSAMPLE * SIZEOF(char)); + dest->iobuffer = (char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, dest->buffer_width); + + if (cinfo->quantize_colors || BITS_IN_JSAMPLE != 8 || + SIZEOF(JSAMPLE) != SIZEOF(char)) { + /* When quantizing, we need an output buffer for colormap indexes + * that's separate from the physical I/O buffer. We also need a + * separate buffer if pixel format translation must take place. + */ + dest->pub.buffer = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->output_width * cinfo->output_components, (JDIMENSION) 1); + dest->pub.buffer_height = 1; + if (! cinfo->quantize_colors) + dest->pub.put_pixel_rows = copy_pixel_rows; + else if (cinfo->out_color_space == JCS_GRAYSCALE) + dest->pub.put_pixel_rows = put_demapped_gray; + else + dest->pub.put_pixel_rows = put_demapped_rgb; + } else { + /* We will fwrite() directly from decompressor output buffer. */ + /* Synthesize a JSAMPARRAY pointer structure */ + /* Cast here implies near->far pointer conversion on PCs */ + dest->pixrow = (JSAMPROW) dest->iobuffer; + dest->pub.buffer = & dest->pixrow; + dest->pub.buffer_height = 1; + dest->pub.put_pixel_rows = put_pixel_rows; + } + + return (djpeg_dest_ptr) dest; +} + +#endif /* PPM_SUPPORTED */ diff --git a/jpeg-8c/wrrle.c b/jpeg-8c/wrrle.c new file mode 100644 index 00000000..a4e73372 --- /dev/null +++ b/jpeg-8c/wrrle.c @@ -0,0 +1,305 @@ +/* + * wrrle.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 routines to write output images in RLE format. + * The Utah Raster Toolkit library is required (version 3.1 or later). + * + * These routines may need modification for non-Unix environments or + * specialized applications. As they stand, they assume output to + * an ordinary stdio stream. + * + * Based on code contributed by Mike Lijewski, + * with updates from Robert Hutchinson. + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ + +#ifdef RLE_SUPPORTED + +/* rle.h is provided by the Utah Raster Toolkit. */ + +#include + +/* + * We assume that JSAMPLE has the same representation as rle_pixel, + * to wit, "unsigned char". Hence we can't cope with 12- or 16-bit samples. + */ + +#if BITS_IN_JSAMPLE != 8 + Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */ +#endif + + +/* + * Since RLE stores scanlines bottom-to-top, we have to invert the image + * from JPEG's top-to-bottom order. To do this, we save the outgoing data + * in a virtual array during put_pixel_row calls, then actually emit the + * RLE file during finish_output. + */ + + +/* + * For now, if we emit an RLE color map then it is always 256 entries long, + * though not all of the entries need be used. + */ + +#define CMAPBITS 8 +#define CMAPLENGTH (1<<(CMAPBITS)) + +typedef struct { + struct djpeg_dest_struct pub; /* public fields */ + + jvirt_sarray_ptr image; /* virtual array to store the output image */ + rle_map *colormap; /* RLE-style color map, or NULL if none */ + rle_pixel **rle_row; /* To pass rows to rle_putrow() */ + +} rle_dest_struct; + +typedef rle_dest_struct * rle_dest_ptr; + +/* Forward declarations */ +METHODDEF(void) rle_put_pixel_rows + JPP((j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, + JDIMENSION rows_supplied)); + + +/* + * Write the file header. + * + * In this module it's easier to wait till finish_output to write anything. + */ + +METHODDEF(void) +start_output_rle (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) +{ + rle_dest_ptr dest = (rle_dest_ptr) dinfo; + size_t cmapsize; + int i, ci; +#ifdef PROGRESS_REPORT + cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; +#endif + + /* + * Make sure the image can be stored in RLE format. + * + * - RLE stores image dimensions as *signed* 16 bit integers. JPEG + * uses unsigned, so we have to check the width. + * + * - Colorspace is expected to be grayscale or RGB. + * + * - The number of channels (components) is expected to be 1 (grayscale/ + * pseudocolor) or 3 (truecolor/directcolor). + * (could be 2 or 4 if using an alpha channel, but we aren't) + */ + + if (cinfo->output_width > 32767 || cinfo->output_height > 32767) + ERREXIT2(cinfo, JERR_RLE_DIMENSIONS, cinfo->output_width, + cinfo->output_height); + + if (cinfo->out_color_space != JCS_GRAYSCALE && + cinfo->out_color_space != JCS_RGB) + ERREXIT(cinfo, JERR_RLE_COLORSPACE); + + if (cinfo->output_components != 1 && cinfo->output_components != 3) + ERREXIT1(cinfo, JERR_RLE_TOOMANYCHANNELS, cinfo->num_components); + + /* Convert colormap, if any, to RLE format. */ + + dest->colormap = NULL; + + if (cinfo->quantize_colors) { + /* Allocate storage for RLE-style cmap, zero any extra entries */ + cmapsize = cinfo->out_color_components * CMAPLENGTH * SIZEOF(rle_map); + dest->colormap = (rle_map *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, cmapsize); + MEMZERO(dest->colormap, cmapsize); + + /* Save away data in RLE format --- note 8-bit left shift! */ + /* Shifting would need adjustment for JSAMPLEs wider than 8 bits. */ + for (ci = 0; ci < cinfo->out_color_components; ci++) { + for (i = 0; i < cinfo->actual_number_of_colors; i++) { + dest->colormap[ci * CMAPLENGTH + i] = + GETJSAMPLE(cinfo->colormap[ci][i]) << 8; + } + } + } + + /* Set the output buffer to the first row */ + dest->pub.buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, dest->image, (JDIMENSION) 0, (JDIMENSION) 1, TRUE); + dest->pub.buffer_height = 1; + + dest->pub.put_pixel_rows = rle_put_pixel_rows; + +#ifdef PROGRESS_REPORT + if (progress != NULL) { + progress->total_extra_passes++; /* count file writing as separate pass */ + } +#endif +} + + +/* + * Write some pixel data. + * + * This routine just saves the data away in a virtual array. + */ + +METHODDEF(void) +rle_put_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, + JDIMENSION rows_supplied) +{ + rle_dest_ptr dest = (rle_dest_ptr) dinfo; + + if (cinfo->output_scanline < cinfo->output_height) { + dest->pub.buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, dest->image, + cinfo->output_scanline, (JDIMENSION) 1, TRUE); + } +} + +/* + * Finish up at the end of the file. + * + * Here is where we really output the RLE file. + */ + +METHODDEF(void) +finish_output_rle (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) +{ + rle_dest_ptr dest = (rle_dest_ptr) dinfo; + rle_hdr header; /* Output file information */ + rle_pixel **rle_row, *red, *green, *blue; + JSAMPROW output_row; + char cmapcomment[80]; + int row, col; + int ci; +#ifdef PROGRESS_REPORT + cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; +#endif + + /* Initialize the header info */ + header = *rle_hdr_init(NULL); + header.rle_file = dest->pub.output_file; + header.xmin = 0; + header.xmax = cinfo->output_width - 1; + header.ymin = 0; + header.ymax = cinfo->output_height - 1; + header.alpha = 0; + header.ncolors = cinfo->output_components; + for (ci = 0; ci < cinfo->output_components; ci++) { + RLE_SET_BIT(header, ci); + } + if (cinfo->quantize_colors) { + header.ncmap = cinfo->out_color_components; + header.cmaplen = CMAPBITS; + header.cmap = dest->colormap; + /* Add a comment to the output image with the true colormap length. */ + sprintf(cmapcomment, "color_map_length=%d", cinfo->actual_number_of_colors); + rle_putcom(cmapcomment, &header); + } + + /* Emit the RLE header and color map (if any) */ + rle_put_setup(&header); + + /* Now output the RLE data from our virtual array. + * We assume here that (a) rle_pixel is represented the same as JSAMPLE, + * and (b) we are not on a machine where FAR pointers differ from regular. + */ + +#ifdef PROGRESS_REPORT + if (progress != NULL) { + progress->pub.pass_limit = cinfo->output_height; + progress->pub.pass_counter = 0; + (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); + } +#endif + + if (cinfo->output_components == 1) { + for (row = cinfo->output_height-1; row >= 0; row--) { + rle_row = (rle_pixel **) (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, dest->image, + (JDIMENSION) row, (JDIMENSION) 1, FALSE); + rle_putrow(rle_row, (int) cinfo->output_width, &header); +#ifdef PROGRESS_REPORT + if (progress != NULL) { + progress->pub.pass_counter++; + (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); + } +#endif + } + } else { + for (row = cinfo->output_height-1; row >= 0; row--) { + rle_row = (rle_pixel **) dest->rle_row; + output_row = * (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, dest->image, + (JDIMENSION) row, (JDIMENSION) 1, FALSE); + red = rle_row[0]; + green = rle_row[1]; + blue = rle_row[2]; + for (col = cinfo->output_width; col > 0; col--) { + *red++ = GETJSAMPLE(*output_row++); + *green++ = GETJSAMPLE(*output_row++); + *blue++ = GETJSAMPLE(*output_row++); + } + rle_putrow(rle_row, (int) cinfo->output_width, &header); +#ifdef PROGRESS_REPORT + if (progress != NULL) { + progress->pub.pass_counter++; + (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); + } +#endif + } + } + +#ifdef PROGRESS_REPORT + if (progress != NULL) + progress->completed_extra_passes++; +#endif + + /* Emit file trailer */ + rle_puteof(&header); + fflush(dest->pub.output_file); + if (ferror(dest->pub.output_file)) + ERREXIT(cinfo, JERR_FILE_WRITE); +} + + +/* + * The module selection routine for RLE format output. + */ + +GLOBAL(djpeg_dest_ptr) +jinit_write_rle (j_decompress_ptr cinfo) +{ + rle_dest_ptr dest; + + /* Create module interface object, fill in method pointers */ + dest = (rle_dest_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(rle_dest_struct)); + dest->pub.start_output = start_output_rle; + dest->pub.finish_output = finish_output_rle; + + /* Calculate output image dimensions so we can allocate space */ + jpeg_calc_output_dimensions(cinfo); + + /* Allocate a work array for output to the RLE library. */ + dest->rle_row = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->output_width, (JDIMENSION) cinfo->output_components); + + /* Allocate a virtual array to hold the image. */ + dest->image = (*cinfo->mem->request_virt_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, + (JDIMENSION) (cinfo->output_width * cinfo->output_components), + cinfo->output_height, (JDIMENSION) 1); + + return (djpeg_dest_ptr) dest; +} + +#endif /* RLE_SUPPORTED */ diff --git a/jpeg-8c/wrtarga.c b/jpeg-8c/wrtarga.c new file mode 100644 index 00000000..cf104d2d --- /dev/null +++ b/jpeg-8c/wrtarga.c @@ -0,0 +1,253 @@ +/* + * wrtarga.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 routines to write output images in Targa format. + * + * These routines may need modification for non-Unix environments or + * specialized applications. As they stand, they assume output to + * an ordinary stdio stream. + * + * Based on code contributed by Lee Daniel Crocker. + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ + +#ifdef TARGA_SUPPORTED + + +/* + * To support 12-bit JPEG data, we'd have to scale output down to 8 bits. + * This is not yet implemented. + */ + +#if BITS_IN_JSAMPLE != 8 + Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */ +#endif + +/* + * The output buffer needs to be writable by fwrite(). On PCs, we must + * allocate the buffer in near data space, because we are assuming small-data + * memory model, wherein fwrite() can't reach far memory. If you need to + * process very wide images on a PC, you might have to compile in large-memory + * model, or else replace fwrite() with a putc() loop --- which will be much + * slower. + */ + + +/* Private version of data destination object */ + +typedef struct { + struct djpeg_dest_struct pub; /* public fields */ + + char *iobuffer; /* physical I/O buffer */ + JDIMENSION buffer_width; /* width of one row */ +} tga_dest_struct; + +typedef tga_dest_struct * tga_dest_ptr; + + +LOCAL(void) +write_header (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, int num_colors) +/* Create and write a Targa header */ +{ + char targaheader[18]; + + /* Set unused fields of header to 0 */ + MEMZERO(targaheader, SIZEOF(targaheader)); + + if (num_colors > 0) { + targaheader[1] = 1; /* color map type 1 */ + targaheader[5] = (char) (num_colors & 0xFF); + targaheader[6] = (char) (num_colors >> 8); + targaheader[7] = 24; /* 24 bits per cmap entry */ + } + + targaheader[12] = (char) (cinfo->output_width & 0xFF); + targaheader[13] = (char) (cinfo->output_width >> 8); + targaheader[14] = (char) (cinfo->output_height & 0xFF); + targaheader[15] = (char) (cinfo->output_height >> 8); + targaheader[17] = 0x20; /* Top-down, non-interlaced */ + + if (cinfo->out_color_space == JCS_GRAYSCALE) { + targaheader[2] = 3; /* image type = uncompressed gray-scale */ + targaheader[16] = 8; /* bits per pixel */ + } else { /* must be RGB */ + if (num_colors > 0) { + targaheader[2] = 1; /* image type = colormapped RGB */ + targaheader[16] = 8; + } else { + targaheader[2] = 2; /* image type = uncompressed RGB */ + targaheader[16] = 24; + } + } + + if (JFWRITE(dinfo->output_file, targaheader, 18) != (size_t) 18) + ERREXIT(cinfo, JERR_FILE_WRITE); +} + + +/* + * Write some pixel data. + * In this module rows_supplied will always be 1. + */ + +METHODDEF(void) +put_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, + JDIMENSION rows_supplied) +/* used for unquantized full-color output */ +{ + tga_dest_ptr dest = (tga_dest_ptr) dinfo; + register JSAMPROW inptr; + register char * outptr; + register JDIMENSION col; + + inptr = dest->pub.buffer[0]; + outptr = dest->iobuffer; + for (col = cinfo->output_width; col > 0; col--) { + outptr[0] = (char) GETJSAMPLE(inptr[2]); /* RGB to BGR order */ + outptr[1] = (char) GETJSAMPLE(inptr[1]); + outptr[2] = (char) GETJSAMPLE(inptr[0]); + inptr += 3, outptr += 3; + } + (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); +} + +METHODDEF(void) +put_gray_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, + JDIMENSION rows_supplied) +/* used for grayscale OR quantized color output */ +{ + tga_dest_ptr dest = (tga_dest_ptr) dinfo; + register JSAMPROW inptr; + register char * outptr; + register JDIMENSION col; + + inptr = dest->pub.buffer[0]; + outptr = dest->iobuffer; + for (col = cinfo->output_width; col > 0; col--) { + *outptr++ = (char) GETJSAMPLE(*inptr++); + } + (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); +} + + +/* + * Write some demapped pixel data when color quantization is in effect. + * For Targa, this is only applied to grayscale data. + */ + +METHODDEF(void) +put_demapped_gray (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, + JDIMENSION rows_supplied) +{ + tga_dest_ptr dest = (tga_dest_ptr) dinfo; + register JSAMPROW inptr; + register char * outptr; + register JSAMPROW color_map0 = cinfo->colormap[0]; + register JDIMENSION col; + + inptr = dest->pub.buffer[0]; + outptr = dest->iobuffer; + for (col = cinfo->output_width; col > 0; col--) { + *outptr++ = (char) GETJSAMPLE(color_map0[GETJSAMPLE(*inptr++)]); + } + (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); +} + + +/* + * Startup: write the file header. + */ + +METHODDEF(void) +start_output_tga (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) +{ + tga_dest_ptr dest = (tga_dest_ptr) dinfo; + int num_colors, i; + FILE *outfile; + + if (cinfo->out_color_space == JCS_GRAYSCALE) { + /* Targa doesn't have a mapped grayscale format, so we will */ + /* demap quantized gray output. Never emit a colormap. */ + write_header(cinfo, dinfo, 0); + if (cinfo->quantize_colors) + dest->pub.put_pixel_rows = put_demapped_gray; + else + dest->pub.put_pixel_rows = put_gray_rows; + } else if (cinfo->out_color_space == JCS_RGB) { + if (cinfo->quantize_colors) { + /* We only support 8-bit colormap indexes, so only 256 colors */ + num_colors = cinfo->actual_number_of_colors; + if (num_colors > 256) + ERREXIT1(cinfo, JERR_TOO_MANY_COLORS, num_colors); + write_header(cinfo, dinfo, num_colors); + /* Write the colormap. Note Targa uses BGR byte order */ + outfile = dest->pub.output_file; + for (i = 0; i < num_colors; i++) { + putc(GETJSAMPLE(cinfo->colormap[2][i]), outfile); + putc(GETJSAMPLE(cinfo->colormap[1][i]), outfile); + putc(GETJSAMPLE(cinfo->colormap[0][i]), outfile); + } + dest->pub.put_pixel_rows = put_gray_rows; + } else { + write_header(cinfo, dinfo, 0); + dest->pub.put_pixel_rows = put_pixel_rows; + } + } else { + ERREXIT(cinfo, JERR_TGA_COLORSPACE); + } +} + + +/* + * Finish up at the end of the file. + */ + +METHODDEF(void) +finish_output_tga (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) +{ + /* Make sure we wrote the output file OK */ + fflush(dinfo->output_file); + if (ferror(dinfo->output_file)) + ERREXIT(cinfo, JERR_FILE_WRITE); +} + + +/* + * The module selection routine for Targa format output. + */ + +GLOBAL(djpeg_dest_ptr) +jinit_write_targa (j_decompress_ptr cinfo) +{ + tga_dest_ptr dest; + + /* Create module interface object, fill in method pointers */ + dest = (tga_dest_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(tga_dest_struct)); + dest->pub.start_output = start_output_tga; + dest->pub.finish_output = finish_output_tga; + + /* Calculate output image dimensions so we can allocate space */ + jpeg_calc_output_dimensions(cinfo); + + /* Create I/O buffer. Note we make this near on a PC. */ + dest->buffer_width = cinfo->output_width * cinfo->output_components; + dest->iobuffer = (char *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (size_t) (dest->buffer_width * SIZEOF(char))); + + /* Create decompressor output buffer. */ + dest->pub.buffer = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, dest->buffer_width, (JDIMENSION) 1); + dest->pub.buffer_height = 1; + + return (djpeg_dest_ptr) dest; +} + +#endif /* TARGA_SUPPORTED */ diff --git a/jpegsrc.v8c.tar.gz b/jpegsrc.v8c.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ae5d1c698d6933e86039c36d810c7428ec8d7b6b GIT binary patch literal 986681 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

      L{}>Y9P64iaL3;5qpLA(cE|*SCK+|Y9 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 z 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 %bu* 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

      DU@r#~- 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

      y=bSF1k1#7LP?vW04qhFrg_6Bc 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%0DP0DDJS1NCpdeNA;Bg^%8k$m} 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ⅈ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%0A8IGGk=GC}FlO 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�mU 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 s%DST%Fy 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

      ~xMhbWGif8cI^m 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

      s%~dNbh4!HiM7p2dy0xQ+(W6!nNYAu55(> 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%0Ah34ZfUc9ouGQHhOCm|MvLx8 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 literal 0 HcmV?d00001 diff --git a/password_reset/__init__.py b/password_reset/__init__.py new file mode 100644 index 00000000..e220fa9e --- /dev/null +++ b/password_reset/__init__.py @@ -0,0 +1 @@ +__version__ = '0.7' diff --git a/password_reset/forms.py b/password_reset/forms.py new file mode 100644 index 00000000..662a101b --- /dev/null +++ b/password_reset/forms.py @@ -0,0 +1,119 @@ +from django import forms +from django.core.validators import validate_email +from django.db.models import Q +from django.utils.translation import ugettext_lazy as _ + +from .utils import get_user_model + + +class PasswordRecoveryForm(forms.Form): + username_or_email = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Email'})) + + error_messages = { + 'not_found': _("Sorry, this user doesn't exist."), + } + + def __init__(self, *args, **kwargs): + self.case_sensitive = kwargs.pop('case_sensitive', True) + search_fields = kwargs.pop('search_fields', ('username', 'email')) + super(PasswordRecoveryForm, self).__init__(*args, **kwargs) + + message = ("No other fields than username and email are supported " + "by default") + if len(search_fields) not in (1, 2): + raise ValueError(message) + for field in search_fields: + if field not in ['username', 'email']: + raise ValueError(message) + + labels = { + 'username': _('Username'), + 'email': _('Email'), + 'both': _('Username or Email'), + } + User = get_user_model() # noqa + if getattr(User, 'USERNAME_FIELD', 'username') == 'email': + self.label_key = 'email' + elif len(search_fields) == 1: + self.label_key = search_fields[0] + else: + self.label_key = 'both' + self.fields['username_or_email'].label = labels[self.label_key] + + def clean_username_or_email(self): + username = self.cleaned_data['username_or_email'] + cleaner = getattr(self, 'get_user_by_%s' % self.label_key) + self.cleaned_data['user'] = cleaner(username) + return username + + def get_user_by_username(self, username): + key = 'username__%sexact' % ('' if self.case_sensitive else 'i') + User = get_user_model() + try: + user = User._default_manager.get(**{key: username}) + except User.DoesNotExist: + raise forms.ValidationError(self.error_messages['not_found'], + code='not_found') + return user + + def get_user_by_email(self, email): + validate_email(email) + key = 'email__%sexact' % ('' if self.case_sensitive else 'i') + User = get_user_model() + try: + user = User._default_manager.get(**{key: email}) + except User.DoesNotExist: + raise forms.ValidationError(self.error_messages['not_found'], + code='not_found') + return user + + def get_user_by_both(self, username): + key = '__%sexact' + key = key % '' if self.case_sensitive else key % 'i' + f = lambda field: Q(**{field + key: username}) + filters = f('username') | f('email') + User = get_user_model() + try: + user = User._default_manager.get(filters) + except User.DoesNotExist: + raise forms.ValidationError(self.error_messages['not_found'], + code='not_found') + except User.MultipleObjectsReturned: + raise forms.ValidationError(_("Unable to find user.")) + return user + + +class PasswordResetForm(forms.Form): + password1 = forms.CharField( + label=_('New password'), + widget=forms.PasswordInput, + ) + password2 = forms.CharField( + label=_('New password (confirm)'), + widget=forms.PasswordInput, + ) + + error_messages = { + 'password_mismatch': _("The two passwords didn't match."), + } + + def __init__(self, *args, **kwargs): + self.user = kwargs.pop('user') + super(PasswordResetForm, self).__init__(*args, **kwargs) + + def clean_password2(self): + password1 = self.cleaned_data.get('password1', '') + password2 = self.cleaned_data['password2'] + if not password1 == password2: + raise forms.ValidationError( + self.error_messages['password_mismatch'], + code='password_mismatch') + return password2 + + def save(self, commit=True): + self.user.set_password(self.cleaned_data['password1']) + if commit: + get_user_model()._default_manager.filter(pk=self.user.pk).update( + password=self.user.password, + ) + return self.user diff --git a/password_reset/locale/de/LC_MESSAGES/django.mo b/password_reset/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..b8c3de93ed6ab9796e9e720663f7cbdf0f8784be GIT binary patch literal 3002 zcmai0OK)366dq`S*1XGG0x=X7V%67ms#dhlL!^mIBJxs_777A1_8nhOb3NnE%#G`? zLa;$}QG`HZ#ine^zN?4@UL!WF;a{*r;yd?VJ9b)HOZIo?dCvLHch2=+#}0qb@OcT} zSMmK5-`DZI@eqFSIr1=LP2f@BF<=My2=GhbJn(Dar@-HVPXJ4Y7<&9 zegWTa0&ie^?6EAapMZ~Iya%iS`#@Shic6mY{s5%-f6nnYAjR=Fumt=E_!{udquKl% z@MVlY1bzd&2CM-81(t#30%LChKLHXiUjb?Vw?GZN4XgrRd7Lo`+yds5GfuusEAIX|-s}qARf)nPrQrG-7UleQ2@F*JCMQsL?V8&@+iWaQRY`W_f7z z+a7UbF<41{q`L=hl(r!6W=GoI-80;1P!byOpo{Jv>y!?*k)7x5-jGhViO5FzWt+y@ zUMUM`5G^bd16ghy(z7FC6_)uGP}L9`VN$Tug14+}&Ky56G4S-W#KuK;eAdcqiFAWp z8ZDomyVd1*Ol{Swgo}>t{Hmkc&I{JZwudOmDwdN>M^z$-c(?nuE1n2 zjNt<}mS+kfe}jO=&a@@m;2kTy)S=Q5-BM3AL0ejoaPG7WA;AMojL}_YLmmb)8D*5$ zd%S7l*mP4XBordDN~i4p#bnVXjfQltnZ!_5T}qu1zfUwGByCw0wU9Q`rM#zAVf|a#k zVU91ZRacfyezdk)D=Z7=gDoqxi-k9~$`^&!((w&c)~;)`_%td56WEcC-;LVW%b}db zK^-LsC)kprUF8e42kxXzg_Wh1+J4lN-$%|ir44GjVMrHMey*;3VLeW)h=Ys9wq2F$PC9fmr>A)KI5VO78#8>eI8|UZ z1!dKO73zhkj{CI0Zel~pcOb|?GemtmbP!+WtBK!*0ydT8AutpcDMlzQ5hEhZEK{pY z+I*>HdEO&D-%V_Pud%%grO)ssW33ucD0RIinzpna6;+qIbYEvnSvOVE=C??tn*u5c75dMB(FBz~YM7%1 zsJcg+1$X^hnygW$MZ+1=a$v|O>gY!OTV6#{Q^y_M%d@0J)be(R-FL`r#w*((mgzY` z>wr5W#_%YT<~{ncPg65EG|2RzTOYJ=z$@30;1usXR&(4Z6tCmUQiY|A9-HX_`5#8z zRT5<2jPo*%$x(DwoQwKin z?j5>vL26R3%^Eopif%=Uz}p*guET3wm1?$s2f9Q*_Nv_`BdKosdv$0)LA}F^wv9$1 z=j%`vRDkVW32}{Vqdx@0Gc@1^4CKmTR7%wTY3eHej%eZzqM6h!O03I4jE(9(AR z6g#Tn1L_@5^4*np(ZrBfdTT1+cAB9Ql`L5xKKB*Mn^5F#5=$JZvN3&UdXyF~kqE4y n9`Yj3B|4r*QePeKH>3##2pv*{%k+K-Hl+fE&|Md=JgM1#a{!y1 literal 0 HcmV?d00001 diff --git a/password_reset/locale/de/LC_MESSAGES/django.po b/password_reset/locale/de/LC_MESSAGES/django.po new file mode 100644 index 00000000..febc5878 --- /dev/null +++ b/password_reset/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,127 @@ +# django-password-reset translations for DE. +# This file is distributed under the same license as the django-password-reset package. +# Hannes Rantzsch , 2014. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-02-07 14:54+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Hannes Rantzsch \n" +"Language-Team: DE \n" +"Language: DE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: forms.py:26 +msgid "Username" +msgstr "Benutzername" + +#: forms.py:27 +msgid "Email" +msgstr "E-Mail" + +#: forms.py:28 +msgid "Username or Email" +msgstr "Benutzername oder E-Mail" + +#: forms.py:48 forms.py:58 forms.py:70 +msgid "Sorry, this user doesn't exist." +msgstr "Entschuldigung, dieser Benutzer existiert nicht." + +#: forms.py:72 +msgid "Unable to find user." +msgstr "Benutzer konnte nicht gefunden werden." + +#: forms.py:78 +msgid "New password" +msgstr "Neues Passwort" + +#: forms.py:82 +msgid "New password (confirm)" +msgstr "Neues Passwort (bestätigen)" + +#: forms.py:94 +msgid "The two passwords didn't match." +msgstr "Die beiden Passwörter stimmen nicht überein." + +#: templates/password_reset/recovery_done.html:3 +msgid "New password set" +msgstr "Neues Passwort wurde gesetzt" + +#: templates/password_reset/recovery_done.html:6 +msgid "" +"Your password has successfully been reset. You can use it right now on the " +"login page." +msgstr "Ihr Passwort wurde erfolgreich zurückgesetzt. " +"Sie können es ab sofort auf der Login-Seite verwenden" + +#: templates/password_reset/recovery_email.txt:1 +#, python-format +msgid "Dear %(username)s," +msgstr "Sehr geehrte(r) %(username)s" + +#: templates/password_reset/recovery_email.txt:3 +#, python-format +msgid "" +"You -- or someone pretending to be you -- has requested a password reset on " +"%(domain)s." +msgstr "Sie -- oder jemand, der vorgibt Sie zu sein -- haben angefordert, " +"Ihr Passwort auf %(domain)s zurückzusetzen." + +#: templates/password_reset/recovery_email.txt:5 +msgid "You can set your new password by following this link:" +msgstr "Folgen Sie diesem Link, um ein neues Passwort festzulegen:" + +#: templates/password_reset/recovery_email.txt:9 +msgid "" +"If you don't want to reset your password, simply ignore this email and it " +"will stay unchanged." +msgstr "Sollten Sie nicht angefordert haben, Ihr Passwort zurückzusetzen, ignorieren " +"Sie einfach diese E-Mail und Ihr Passwort bleibt unverändert." + +#: templates/password_reset/recovery_email_subject.txt:1 +#, python-format +msgid "Password recovery on %(domain)s" +msgstr "Rücksetzung Ihres Passwortes auf %(domain)s" + +#: templates/password_reset/recovery_form.html:5 +msgid "Password recovery" +msgstr "Passwort zurücksetzen" + +#: templates/password_reset/recovery_form.html:11 +msgid "Recover my password" +msgstr "Passwort zurücksetzen" + +#: templates/password_reset/reset.html:5 +#, python-format +msgid "" +"Sorry, this password reset link is invalid. You can still request a new one." +msgstr "Es tut uns Leid, dieser Link zur Passwortwiederherstellung ist ungültig. Sie können einen neuen anfordern." + +#: templates/password_reset/reset.html:7 +#, python-format +msgid "Hi, %(username)s. Please choose your new password." +msgstr "Hallo, %(username)s. Bitte wählen Sie Ihr Passwort." + +#: templates/password_reset/reset.html:11 +msgid "Set new password" +msgstr "Neues Passwort speichern" + +#: templates/password_reset/reset_sent.html:4 +msgid "Password recovery sent" +msgstr "Passwortrücksetzung versandt" + +#: templates/password_reset/reset_sent.html:7 +#, python-format +msgid "" +"An email was sent to %(email)s %(ago)s ago. Use the link in " +"it to set a new password." +msgstr "Eine E-Mail an %(email)s wurde vor %(ago)s versandt. " +"Nutzen Sie den darin enthaltenen Link um Ihr Passwort zurückzusetzen." diff --git a/password_reset/locale/es/LC_MESSAGES/django.mo b/password_reset/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..4eb4943e05f7383e4ce142691da89c2b01c3b32f GIT binary patch literal 2779 zcma)7&2Jk;6ra)pt@$n#I3V>=R1u4;>!cvH&W8wz+eVPYBxz9r6^(bt_O!b*W@gu} z%MDIQfGPn8_!B@#J#pm55pn66I|mNjIq-YC>yNY*Vx{%Zvpe%Xe($~C{&D=sw*uD- zxL?A37xzirUmU^@uA>hL(E%O<9tZY;4+B2~t^+>@UIYFHd>lA`ScvC==YdZHTfk?4 z63BLa`TlF*vsnKC^1h`b1%3d04(m^VM}fD2Z0|eZd%z!oZvYP?s4Kwp zz^@SdZQw1ePd+Nd3E=lYj{6R<3H%u-f&Ty>173r1=HPmXp91r9z*q464)8_bT_E%D z7m(u;$AlOHP5?RXFM(|5Cm^5u6$lsNPvBF)zkweD4^@h|uK_P${SC0BT!6})6OM~7 z<_T%$7u@Fd%Vi$R6Ij5kcmy}-%i{)!CvkI4I8Nq_FOG%l!x!@bw|QJ*&5%l@j%g@8 zd1X>cEiL=hS<_uTJ(s_$`sFj_6FNO7ySC~Hzcsq-6{S5zu{JkI8`Ak{uTqj^)R6kp z`=NDFO>8LXa5nSG8JVc6pBGJbD=z8z8F$n76OT1&#Y)0a*s~TevYETb_-2QnQe@4m zDe@?CaEjx|caOuEC$E!!JR;pS)^X_Cm)T1bar8qS$K+EvqRfOnX}SurZ_i|MU_o=C zH687e>cPiwELvsijC`o8?#RS?5Oc zMMC3j;h7mIYU5F!fsA!jqpP4Qlm=;XvdfZsPIXpJot_&<`cdZMsz0^r)W@0f<62sy zme0u5+5ul&FYvBBGp}xHpVq`a8X_IqNwl6K9r61_reUupE*sg7vBgqHgLO86hh<|- z{*ZN4bO^^A1ibb(Q3!+jPNm93+H~1UJMRhJ(nAZEL8}NYcn=c?=&p$g592nOWt7?@ z>ex88!`uru3KQAjQ*LUQJ^CyRmG_-2MrXB^G6nHdqLCr@mebuH%4UaL_k3z>7c(XG$cXbrJm34ivZyQu; z?d%8ZPRSI9f(@Cf1})YX&ISwh;B1{17aNPO2lcb{IyMHoYM|M8x$kOoZ8zB32{zW~ z(oSP*^R@SPwwslAq)&r=CykF~YF&f2qzkR5i?Z#sifJtlc!a*{u<$zuIxmj}8Q z+GG_bOgBSf!M>77gPME)XEX1sY;A5erxYyI>XmhCP;Eps>LayO-AvE)V~ora6hS() z_{!z|3&FYRK90PjT+lS3=GPc9-DZn@=_IeRzH%Vb zV<=-eP~zQ8Iez~@v9xg!0J4HO^XL?6I;)l#l#U$W7n@iD*tE&iKo$-#z#2oBVnU3? z$P^QkyUYxPA!%z%5#*MmDHT&CC;*zckWFZUD(M-q4MZVHhG_7ba?J+p^d?{Z2)wCN;{2R{X;vjV!#5l<+MWLY#hIqWFWCCi&RH{gAS8L^>#n8kf$ z4Voc>MU7CqvP@H6NKFJ)a)p`Aex^X%f9R>Vu?}?#r>Hnw=`Td!GA724gT+)Gm{EUdY?F_JA+wTPK@m1Nw_G^iZQ zDx@_pYS|^ZupaD^b}S9P4YPch>6Z*0RyK3VN#0aw42)9l3FZ-Ex!_*PM`L, 2013. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-10-30 22:24-0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Marcos Gabriel Alcazar \n" +"Language-Team: ES \n" +"Language: ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: forms.py:26 +msgid "Username" +msgstr "Usuario" + +#: forms.py:27 +msgid "Email" +msgstr "Email" + +#: forms.py:28 +msgid "Username or Email" +msgstr "Usuario o Email" + +#: forms.py:48 forms.py:58 forms.py:70 +msgid "Sorry, this user doesn't exist." +msgstr "Disculpe, el usuario no existe." + +#: forms.py:72 +msgid "Unable to find user." +msgstr "No es posible encontrar el usuario." + +#: forms.py:78 +msgid "New password" +msgstr "Nueva clave" + +#: forms.py:82 +msgid "New password (confirm)" +msgstr "Nueva clave (confirmar)" + +#: forms.py:94 +msgid "The two passwords didn't match." +msgstr "Las claves no coinciden" + +#: templates/password_reset/recovery_done.html:3 +msgid "New password set" +msgstr "Nueva clave actualizada" + +#: templates/password_reset/recovery_done.html:6 +msgid "" +"Your password has successfully been reset. You can use it right now on the " +"login page." +msgstr "" +"Su clave ha sido restaurada. Puede utilizarla para ingresar al sistema" + +#: templates/password_reset/recovery_email.txt:1 +#, python-format +msgid "Dear %(username)s," +msgstr "Querido %(username)s," + +#: templates/password_reset/recovery_email.txt:3 +#, python-format +msgid "" +"You -- or someone pretending to be you -- has requested a password reset on " +"%(domain)s." +msgstr "" +"Usted -- o alguien pretendiendo ser usted -- ha requerido un blanqueo de clave en" +"%(domain)s." + +#: templates/password_reset/recovery_email.txt:5 +msgid "You can set your new password by following this link:" +msgstr "Su clave puede cambiada siguiendo el siguiente enlace" + +#: templates/password_reset/recovery_email.txt:9 +msgid "" +"If you don't want to reset your password, simply ignore this email and it " +"will stay unchanged." +msgstr "" +"Si usted no ha requerido un cambio de clave, simplemente ignore este email y " +"no sera actualizada." + +#: templates/password_reset/recovery_email_subject.txt:1 +#, python-format +msgid "Password recovery on %(domain)s" +msgstr "Recuperacion de clave en %(domain)s" + +#: templates/password_reset/recovery_form.html:5 +msgid "Password recovery" +msgstr "Recuperacion de clave" + +#: templates/password_reset/recovery_form.html:11 +msgid "Recover my password" +msgstr "Recuperar mi clave" + +#: templates/password_reset/reset.html:5 +#, python-format +msgid "" +"Sorry, this password reset link is invalid. You can still request a new one." +msgstr "" +"Disculpe, la url para el recupero de clave es invalida. Usted puede solicitar una nueva." + +#: templates/password_reset/reset.html:7 +#, python-format +msgid "Hi, %(username)s. Please choose your new password." +msgstr "Hola %(username)s. Por favor ingrese su nueva clave." + +#: templates/password_reset/reset.html:11 +msgid "Set new password" +msgstr "Ingresar nueva clave" + +#: templates/password_reset/reset_sent.html:4 +msgid "Password recovery sent" +msgstr "Clave recuperada enviada" + +#: templates/password_reset/reset_sent.html:7 +#, python-format +msgid "" +"An email was sent to %(email)s %(ago)s ago. Use the link in " +"it to set a new password." +msgstr "" +"Un email ha sido enviado a %(email)s hace %(ago)s minutos. " +"Use el enlace recibido para recuperar su clave" diff --git a/password_reset/locale/ka/LC_MESSAGES/django.mo b/password_reset/locale/ka/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..a00b319f41840ffc624946f664bd5656e3a347eb GIT binary patch literal 4179 zcmb7`-)|gO6~`~M^oLtYDFsvssaL5YY{j#&OOVpF9mT|MYBi26#|a9RTE@HAyVK6j zU1nzOT0HI(hzHX&{XtT+p#n;ZfEQk?KK7;RLwVo{Y5xSCc&XHW&b_na-HnOcm1e$k z?>#@i=bV}S&tvyqSNy)u^#iVdaXrcPo3C->_rTYc+6Es49|POqH^44<4*V7PBKR@* zFgSgWQr`og0Urg|!Eb{hD0Z{r{2KTj*0({C`v80e`~(!axqCgn06xz8m*4~7J}CCy z27d~^5B?auhoG*2&wweh?}MMo{{2dQ6BK2M`w_4QJ`R2k{u4YV_@Gi}!GD8G;1d%{ zod9117r`}2R{9f#{~Q@>)W85--Lv#;C(oK3H&)IynP5h1%3+t1NC7a#&aIx$^3*1cGsh?0*;F=vve?nbC&PxF$~54$e!D z6}=vt5J$D9wZNY3q+`Zcwq;k>ZSupMJbVtRkvN?6AdG39MXh$cr=vz|aPiT-Wo`nHln~d`8gmF}_=&Mjw3lq|m zWamTOOwIPfvE!42NMGut@lVRUX8N6qBd!W zeAkxIX1X5L<-8T5PE2QQ8IyS84~Qm1>8&(sG%1_imAbpBu?=RX9X3owt*7>7Q_F*udT_<0S!9!{ zUSB--{Nnj#ePwy$(#qP!i4D`XX&$U*ji?^{q|?ZPOua0AxzvO?O2JZ?o2q_# zX7*Gt^P^z)w4Oaxot-@~b82P=!C=GeL}I*22ZO9l`YPNL-#iY?8onX_1 zt*XATc=7yYNnrlMg|l%~v1#K#hQL=>R+kU5ovqAFoU;jq#ra;FEOPT|ezF}i9ditS zn9|J)mp7jcP9MlgklQ8=mXn&5eyHlxTTwo-9(U3(4xY7XE34|H?UvcX?40(G3o~;Q z%Dvixe)p}R_s{t2j^j7_-Pbiz{qCRp-FJ9;t>4{ucTRY?-tXRY$G;O(gV$rf`&YMl zvx3GA6y54??ir;XM*H12IRkD1qU;R4EmqtDEw*ksCvQ4GvgEAi%-!JWnmfcEp<#$P z@FP~)!WVZJRKNRsxA2Oxr4D-)4^qRi5ApBL-fvkR`HptFM2S~IfRiGMGIf0a#U)ha zjqD$tppRQ}J~C*m_Pg&QIil<}djOSzu6G?n;(t7APv3ivtJ}^wTn0*>ql+JS27>=y;wbQE-Pgl|l*HC8;khJM^_I z2JwCQaUk_KWio)A%b#!yGMrP=NvOER3FVf)kx2>78@?N>n!}} z_{85Y%S~)|`x|j*j=lz19xj8tx%?jt*X?&?Ow>LQl!Rn&ggf+c_euFq>}$A zy}Dl#9lSgK}XoVW!3+rR0f-I$u{-EcQ@cv<#Gvu6Q&lN-AiQ)vG+>04O{pbuZ zRmx$;+mL=$jttTw`NHNQTj(Nk)Blf>FC8+3ckteoKTU;, 2014. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-18 14:11+0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Givi Khojanashvili \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: forms.py:26 +msgid "Username" +msgstr "სახელი" + +#: forms.py:27 +msgid "Email" +msgstr "Email" + +#: forms.py:28 +msgid "Username or Email" +msgstr "სახელი ან Email-ი" + +#: forms.py:51 forms.py:61 forms.py:73 +msgid "Sorry, this user doesn't exist." +msgstr "ბოდიში, ასეთი მომხმარებელი არ არსებობს." + +#: forms.py:75 +msgid "Unable to find user." +msgstr "შეუძლებელია მომხმარებელის მოძებნა" + +#: forms.py:81 +msgid "New password" +msgstr "ახალი პაროლი" + +#: forms.py:85 +msgid "New password (confirm)" +msgstr "ახალი პაროლი (დამოწმება)" + +#: forms.py:97 +msgid "The two passwords didn't match." +msgstr "ორი პაროლი არ ემთხვევა ერთმანეთს." + +#: templates/password_reset/recovery_done.html:3 +msgid "New password set" +msgstr "ახალი პაროლი დაყენებულია" + +#: templates/password_reset/recovery_done.html:6 +msgid "" +"Your password has successfully been reset. You can use it right now on the " +"login page." +msgstr "" +"თქვენი პაროლი იყო წარმატებულად შეცვლილი. თქვენ შეგიძლიათ ის ეხლავე მოიხმაროთ ავტორიზირების გვერდზე" + +#: templates/password_reset/recovery_email.txt:1 +#, python-format +msgid "Dear %(username)s," +msgstr "%(username)s," + +#: templates/password_reset/recovery_email.txt:3 +#, python-format +msgid "" +"You -- or someone pretending to be you -- has requested a password reset on " +"%(domain)s." +msgstr "" +"თქვენ -- ან ვინმემ თქვენი სახელით -- მოითხოვეთ პაროლის შეცვლა " +"%(domain)s-ზე." + +#: templates/password_reset/recovery_email.txt:5 +msgid "You can set your new password by following this link:" +msgstr "გადადით შემდეგ ლინკზე და შეძლებთ ახალი პაროლის დაყენებას:" + +#: templates/password_reset/recovery_email.txt:9 +msgid "" +"If you don't want to reset your password, simply ignore this email and it " +"will stay unchanged." +msgstr "" +"თუ თქვენ არ გსურთ პაროლის შეცვლა ნუ მიაქცევთ ყურადღებას ამ email-ს და " +"თქვენი პაროლი უცვლელი დარჩება" + +#: templates/password_reset/recovery_email_subject.txt:1 +#, python-format +msgid "Password recovery on %(domain)s" +msgstr "პაროლის აღდგენა %(domain)s-ზე" + +#: templates/password_reset/recovery_form.html:5 +msgid "Password recovery" +msgstr "პაროლის აღდგენა" + +#: templates/password_reset/recovery_form.html:11 +msgid "Recover my password" +msgstr "ავღადგინო ჩემი პაროლი" + +#: templates/password_reset/reset.html:5 +#, python-format +msgid "" +"Sorry, this password reset link is invalid. You can still request a new one." +msgstr "" +"ბოდიში, პაროლის შეცვლის ლინკი არასწორია. თქვენ ისევ შეგიძლიად ახალი მოითხოვოთ." + +#: templates/password_reset/reset.html:7 +#, python-format +msgid "Hi, %(username)s. Please choose your new password." +msgstr "გამარჯობა, %(username)s. გთხოვთ ამოირჩიეთ თქვენი " +"ახალი პაროლი" + +#: templates/password_reset/reset.html:11 +msgid "Set new password" +msgstr "დავაყენო ახალი პაროლი" + +#: templates/password_reset/reset_sent.html:4 +msgid "Password recovery sent" +msgstr "პაროლის აღდგენის მოთხოვნა გაგზავნილია" + +#: templates/password_reset/reset_sent.html:7 +#, python-format +msgid "" +"An email was sent to %(email)s %(ago)s ago. Use the link in " +"it to set a new password." +msgstr "" +"email-ი %(email)s-ზე იყო გაგზავნილი %(ago)s წინ. მოიხმარეთ ეს " +"ლინკი იმისათვის რომ დააყენოთ ახალი პაროლი" diff --git a/password_reset/locale/nb/LC_MESSAGES/django.mo b/password_reset/locale/nb/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..aaae85ac9eb3c66d6e39bf800c189293e19a7f5e GIT binary patch literal 2463 zcmah~OOG2x5N;s6%sT><11LqLRo04UvKtW*Io?&AwKr>G@2>WRk^^Y$X^%T@cbo1R zJ3fLqa^b+00|HJUfw<(pk+^c;5(y!Z-@t(*U(bvm8&DYS>^D7AUG-Jf*X2J>pZb#F zI*t1++~4DV8+YXi{KNGlunYVN=xokB$=K7t3&0KFD)2*K0(=qp8}LowpTM)gzkz+= znWwV#XE}ZYd>!xa1D^vv0KNu%2>bx}7w|H$d5W?)ErdU(O#zw1XeQ7!URXIB#^_ zTMD&0A0v+}2g4nY)Ot#zL{b|Z!ctW zVnNFtt-8VtiflK}lnn3a5jPXk3i*Z_Nvfh{``VaEDT_Fz16xNiE1pIDMu8NePq&au zCs5$w*i-`Q8Qxtxx3oO<{ZV3M(Vkm3{Nse%X|c89m5af;e`(=52@_3SfwDLkc$s%@_CVTD)S`(VIE~^u=?YnPyUg6Ni)fQh zhg;iCBwF9*TxEry7aAG5<{J_9Vp4kSdY8&tM-cTeh`7&ojlRP>vDXN_BW|qFs!Y4p zjhodQbvml=?KgI|3wwO1P3*O7Btq|c5?Sv+m#MJ3bKq?l9>mz>)qC(#TyWR@^ zF5|I$`MnD(xM1k*@sV)ObGuvh>Ymry@oH7t+9|gh7jExt*9*Mml$AlOO_??i zn@!rTw(3-=x2lciwQ8-lSKr@XhpCDZB;XzJU{I!Jb^FGlqg-h=uSwx+6U}Wvwbf|V z=lQMrD}@cM&`N}x48c3*cjJpg2~A(cc?=BnyLNc6>0O!IIa*zAyt?XWr+_kDX^Xh9 zD-#n)Z&RCrEt49iOS^XIDrJvr%ZlDvqt)Wo0;^*t4K;*~2-KD$j@@JmFd2~TdT^MP5#RUd0-d;G1_rXCOkrY4Bu^q7vTn|F@C!+>~XU^z}~ zi~s+`I^s%65g~&Sml2K^e5(o0#nk^6x=dk0qTlCqd{5avj;W&q7Be&IV+gTE+- zB&cfwmkdr=S|21>bFOo@G(vfh7b->xa>XIU@LI@=UFUs_l9S1@8*j`w5#af53g>>N{WhsXCIBI%l-CYgUfn_~0GS;lR2 zk{giVeTy-M$1GqvdeJoQs*-b%qK_lHDNw2W&2+cVoFd$h&`2#j5|, 2014. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-04-05 20:57+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: forms.py:26 +msgid "Username" +msgstr "Brukernavn" + +#: forms.py:27 +msgid "Email" +msgstr "Epost" + +#: forms.py:28 +msgid "Username or Email" +msgstr "Brukernavn eller epost" + +#: forms.py:51 forms.py:61 forms.py:73 +msgid "Sorry, this user doesn't exist." +msgstr "Beklager, denne brukeren eksisterer ikke" + +#: forms.py:75 +msgid "Unable to find user." +msgstr "Finner ikke brukeren." + +#: forms.py:81 +msgid "New password" +msgstr "Nytt passord" + +#: forms.py:85 +msgid "New password (confirm)" +msgstr "Bekreft nytt passord" + +#: forms.py:97 +msgid "The two passwords didn't match." +msgstr "Passordene er ikke like." + +#: templates/password_reset/recovery_done.html:3 +#, fuzzy +msgid "New password set" +msgstr "Nytt passord" + +#: templates/password_reset/recovery_done.html:6 +msgid "" +"Your password has successfully been reset. You can use it right now on the " +"login page." +msgstr "" +"Ditt passord har blitt endret. Du kan nå logge inn med ditt nye passord." + +#: templates/password_reset/recovery_email.txt:1 +#, python-format +msgid "Dear %(username)s," +msgstr "Kjære %(username)s," + +#: templates/password_reset/recovery_email.txt:3 +#, python-format +msgid "" +"You -- or someone pretending to be you -- has requested a password reset on " +"%(domain)s." +msgstr "" +"Du, eller noen som utgir seg for å være deg, har bedt om et nytt passord for " +"%(domain)s." + +#: templates/password_reset/recovery_email.txt:5 +msgid "You can set your new password by following this link:" +msgstr "Du kan sette nytt passord ved å følge denne linken:" + +#: templates/password_reset/recovery_email.txt:9 +msgid "" +"If you don't want to reset your password, simply ignore this email and it " +"will stay unchanged." +msgstr "" +"Hvis du ikke ønsker å bytte passord kan du se bort i fra denne eposten.Ditt " +"passord vil forbli uendret." + +#: templates/password_reset/recovery_email_subject.txt:1 +#, python-format +msgid "Password recovery on %(domain)s" +msgstr "Glemt passord for %(domain)s" + +#: templates/password_reset/recovery_form.html:5 +#, fuzzy +msgid "Password recovery" +msgstr "Glemt passord for %(domain)s" + +#: templates/password_reset/recovery_form.html:11 +#, fuzzy +msgid "Recover my password" +msgstr "Nytt passord" + +#: templates/password_reset/reset.html:5 +#, python-format +msgid "" +"Sorry, this password reset link is invalid. You can still request a new one." +msgstr "" +"Beklager, men lenken for bytte av passord er ikke korrekt. Send forespørsel om ny lenke.." + +#: templates/password_reset/reset.html:7 +#, python-format +msgid "Hi, %(username)s. Please choose your new password." +msgstr "Hei, %(username)s. Vennligst velg ditt nye passord." + +#: templates/password_reset/reset.html:11 +#, fuzzy +msgid "Set new password" +msgstr "Nytt passord" + +#: templates/password_reset/reset_sent.html:4 +#, fuzzy +msgid "Password recovery sent" +msgstr "Glemt passord for %(domain)s" + +#: templates/password_reset/reset_sent.html:7 +#, python-format +msgid "" +"An email was sent to %(email)s %(ago)s ago. Use the link in " +"it to set a new password." +msgstr "" +"En epost har blitt sendt til %(email)s for %(ago)s siden. " +"Bruk den tilsende lenken for å be om et nytt passord." diff --git a/password_reset/locale/pl/LC_MESSAGES/django.mo b/password_reset/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..04f6d38faa48ab131511d5802eaa47b69b4c19cb GIT binary patch literal 2904 zcmai0%a2o49KH%7RD9ucVd5_sU>bW%I|C8QbbJgDPzLHy7>tSLwD+__`oKr5h z;s!G@CN4;f3&MY(OLt^+8dCrt6t$!T2kn+xH!?1N<52_MO_D;`_j7G5!d+7kCHg?A--!0KWzv2kt^p zSAi#ie<1cdK#TFmkEVY91iHBQz{m=4Kkz#69pGcYZ-FlYe*``U{2l1x`wK|G{rf!c z6`&7%68J7K$qU%U*Z_|Je*?Pw_hmfqAdrBLw^g9y_bPB5Xn-exKLD=*{|1gI_dsRB ziHplUE)JxbJP0SL)o7U5ejEe1_4eQeeM$TP?+LuFCXPQBt9w905}*5ae86pzkN2h| z-en@Bh#4|mTC$3kjnzsvR}L*CYgw~=bTmVU7Fbhd4dHK|t{6_X#VHiBLqd{BP8)8C zk>nBem@$#kLEbyfna0_^;aajT&zhWf#<}&*iQJ64>H5TDo+=?{a8z$81&CE&KVbZP z!_88lGa0z(BN2vVEQ_fx>n$dm9I;=V z$z*Oo3w0$MLU*(C({SunMyZqLb#;U5_}??6Bq#|Kc#v7M!@4Vnx1OG-ZaksWyNt|c z`SmUavp&^TLob_}GoF(}Us7K$KG?}4g1lStDgyUeJid82&r(84&<5BoaInu9Bv zU+;4>uBDQE`6ye-&-rro0`J^7=J`!wY~HIv5H?biXblA-aO+)W>#e+ZMY39mEs7cf ztUD8!90_CcK}u7q5ErlSyRlJSjxeaFx#cntvgxeU5>2=*El7A2G!G!b2bh?nJMT?+ z7|UdqQL4q%P+_Q|#ETP(BeLX9>8WAo(e&$eZcL*eLRmG=WlH>%Xk_TLrA4!avZ=_` zJ-Icii96F{O`i8ETD5uI`sV}xD%VCRS)!l~0V;o-g`dt@0?3=7>jFJwclWG*1+K63J_oOMg|Kf4h5 z+WECJ)1-^}LS|J-)ED049@4P&BF-#kGuQlz;(@UKIPVfwR47bqy0WVJ(&{)_K%dEY;~pBt22@Ig zw!_c{)bQT+rz9D%0HvPkiVrqnG~VG>+@=AGn6|vB$g(b}K*E9)9p=P4=n5_c>_MW# z+bZvE2+P_#w%}ytf4lHTPnZFrowvCYF`pQIn-A}Wf~0UQ8aH7u^3BH1S&n*W2U;21 zr$N$t`)#t@cW3j?;l2*HSb*z|(3y-Ag9Dsla(j~^9FJHq!1YH%p1Pm?riGrek>ENQ z-p`_uSQbI#YBpN$QZR^3N8m>S;U?6uo#rT-?aUkFI!!1>&l`t1X9NtVe5dZ`TwfGu zrrf$VjUF*I)pk7=;q)}(4N$8n&eNJ2ZaFI3JdmvOUtM~@hFja4fn(d1rK!>`J>!ja z1oa^p+ffnZkr0bc4VP{1opbVF_+dmj^!MKkw;-BLPz-t?$StUGAX&(V_hEm=2*VaO zh}hiR4pS8NYw1s{SB+hdcH@qPP@#!{wYN9xaq4`)XjSkU{9@NQDYToB8d93)>XP@y zEcKIGj~EzLAV-}LcfonUsX59^UNw<%S}ICJ2Hp`-H-?r$%t*pcZIe>qnzg||lCg6I R(%gSZ*c_@R#3=, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: django-password-reset\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-01-30 12:57+0100\n" +"PO-Revision-Date: 2013-01-30 13:04+0100\n" +"Last-Translator: Michał Sałaban \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"X-Poedit-Language: Polish\n" +"X-Poedit-Country: Poland\n" + +#: forms.py:25 +msgid "Username" +msgstr "Nazwa użytkownika" + +#: forms.py:26 +msgid "Email" +msgstr "Email" + +#: forms.py:27 +msgid "Username or Email" +msgstr "Nazwa użytkownika lub email" + +#: forms.py:46 +#: forms.py:55 +#: forms.py:66 +msgid "Sorry, this user doesn't exist." +msgstr "Niestety, taki użytkownik nie istnieje" + +#: forms.py:68 +msgid "Unable to find user." +msgstr "Nie można znaleźć użytkownika." + +#: forms.py:74 +msgid "New password" +msgstr "Nowe hasło" + +#: forms.py:78 +msgid "New password (confirm)" +msgstr "Nowe hasło (potwierdź)" + +#: forms.py:90 +msgid "The two passwords didn't match." +msgstr "Hasła się różnią." + +#: templates/password_reset/recovery_done.html:3 +msgid "New password set" +msgstr "Ustawiono nowe hasło" + +#: templates/password_reset/recovery_done.html:6 +msgid "Your password has successfully been reset. You can use it right now on the login page." +msgstr "Twoje hasło zostało pomyślnie zmienione. Możesz go już użyć na stronie logowania." + +#: templates/password_reset/recovery_email.txt:1 +#, python-format +msgid "Dear %(username)s," +msgstr "Witaj %(username)s," + +#: templates/password_reset/recovery_email.txt:3 +#, python-format +msgid "You -- or someone pretending to be you -- has requested a password reset on %(domain)s." +msgstr "Ty -- lub ktoś podający się za Ciebie -- zażądał zmiany hasła w %(domain)s." + +#: templates/password_reset/recovery_email.txt:5 +msgid "You can set your new password by following this link:" +msgstr "Możesz ustawić nowe hasło, klikając w ten odnośnik:" + +#: templates/password_reset/recovery_email.txt:9 +msgid "If you don't want to reset your password, simply ignore this email and it will stay unchanged." +msgstr "Jeśli nie chcesz zmieniać hasła, po prostu zignoruj tę wiadomość, a żadne zmiany nie zostaną wprowadzone." + +#: templates/password_reset/recovery_email_subject.txt:1 +#, python-format +msgid "Password recovery on %(domain)s" +msgstr "Odzyskiwanie hasła w %(domain)s" + +#: templates/password_reset/recovery_form.html:5 +msgid "Password recovery" +msgstr "Odzyskiwanie hasła" + +#: templates/password_reset/recovery_form.html:11 +msgid "Recover my password" +msgstr "Odzyskaj hasło" + +#: templates/password_reset/reset.html:5 +#, python-format +msgid "Sorry, this password reset link is invalid. You can still request a new one." +msgstr "Niestety, ten odnośnik jest nieprawidłowy. Możesz jednak zażądać nowego." + +#: templates/password_reset/reset.html:7 +#, python-format +msgid "Hi, %(username)s. Please choose your new password." +msgstr "Witaj, %(username)s. Wpisz swoje nowe hasło." + +#: templates/password_reset/reset.html:11 +msgid "Set new password" +msgstr "Ustaw nowe hasło" + +#: templates/password_reset/reset_sent.html:4 +msgid "Password recovery sent" +msgstr "Wysłano odnośnik do zmiany hasła" + +#: templates/password_reset/reset_sent.html:7 +#, python-format +msgid "An email was sent to %(email)s %(ago)s ago. Use the link in it to set a new password." +msgstr "%(ago)s wysłano wiadomość na adres %(email)s. Użyj zawartego tam odnośnika by zmienić hasło." + diff --git a/password_reset/locale/ru/LC_MESSAGES/django.mo b/password_reset/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..f073c350a3fc2d45027e8cf6ab8bbc70e69e11d3 GIT binary patch literal 3449 zcmb7F-ES0C6u$~86!8NTUrfBB#ct>F(`zV0LDmJ46{sQBj#AhFk55D>2o4<2scf0)nagy2J+GHm_rB z8*m@+Iba{~d7ufTb7f`ybKq8te*}`eS0LH#UmxOoz!xz72)F_G8IaEV3V00o z6L1f39fCRv+y|UN?4JRDz&QOBV;uMwkmBBqLww*?;1%EmkaFL)k+I#tD6k2b0Y-q6 zz=Ocsz%JlFz}J9>8jvgS1n@ra2CxlyY!hRz1HS;$`aBRz>`x&1`5Wi~H-W4i@MGXL z;2*#Wn)O7*lZqZwDc;^Vs@~rE;;UkYQ2TxEO+PWG>GnZDrV2^Vv=eQn)Zpljarjw=U z$1L0C(l^I>(aDUOPEH{9p1Mqy4R}+=bw(^NA6Y&P$E>fCI`>4zJte&H)id06KuOjG z4^Bj`u};s$Z9QJN3`xT+oH>SQN6&ski@(=ZAm}M1|bN4 z%&kQ$dDhC(dfxOiqfs{Gn8P+qTs~rfbvgo*6=Bpqxa;vyAr!A+&{(>8fiQT%6TWb= zmXo7XhP5WhWE2vv1TC_V;0h*|(H&(q9;z~_XOs_*^AXp!-7)QjghE6nXqUHiFnN^4 zOh!mKQnaD0VIiE5_$8u|A!*CAa-%4lJ4SWaUE}7^GX*mzqO8wzPl$|fbY_jC!jqQk zBzRw{{hid|G(Vc|AL#7uY3LUP*Yk~TnX|IS!D3DtgKmO1^z{xJ?Vd1wY%)4bUnF=- zEZ$K-D%#M?oM@f9Y}R_^rr^~+FN6?MJbk_|%b?(9x4Ln;aTEWb9qC zqp(JVXQZ8sOA1Kvy~CE@&}SDt(>4ydUS1}+Q_w@1d~-h!Ka)*PV?35j#`%sNoIYc( zCgXAbHjiTW*TrjB?)FKbg zaW$*%VSGL~8(dI#gHNzJg|%6(?!!P$t3_H>C3R0NVl=PH_?iu_(t0U4i^=(5imRW4 z%UHvPMHt`5e5q!P$$P3)cVRy8ekMD02k#71H?hB@ZsRSh1sp!N=1r__sF~22j&d3~ z%prjCf8NiaVNstxueazFdFUH1^%)d4Qr5oflAUDgdTe064OT%1 z7(hsuDGQK0Nlcc4iF(#1n=v8=b?9J84^WR=_B?N*!h*H)h^P!Nx7AGbtjL27(|&`CuqGWq0Zd)1#7%Y9JXNIu0_xbBs<(WY zT__UdS7pEMUj|h!RjCT?;B-x0u5iAF99PFP8`ft@&ZzLsWumWG=R0rToE0s)4gczKs3#D=oP)F!yAdya!2oOXmxJpLf z|DO}T)~-P)Q?*aJsHo?{|5tU5Ixn2Tt%cSw=!YXBbVf7jwUWP@58Jwua!qE`p^(rr zt=1M-YcLAkkjr}hgA0$Yl4^I)q4Pi;-K}9u<6^7RNjX9KTzOGcu2)VDv9%mbP|H!0 xVHOkAl2NX{1I`7XVn6a)B^Oj+nn*(8vrEMcCgFYxXHoLub+=GQ3Qk;L{{rGi?$Q7N literal 0 HcmV?d00001 diff --git a/password_reset/locale/ru/LC_MESSAGES/django.po b/password_reset/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 00000000..8ad17f19 --- /dev/null +++ b/password_reset/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,125 @@ +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Semen Pupkov , 2012. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-11-04 15:01+0600\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" + +#: forms.py:25 +msgid "Username" +msgstr "Логин" + +#: forms.py:26 +msgid "Email" +msgstr "Email" + +#: forms.py:27 +msgid "Username or Email" +msgstr "Логин или Email" + +#: forms.py:46 forms.py:55 forms.py:66 +msgid "Sorry, this user doesn't exist." +msgstr "Извините, такого пользователя нет" + +#: forms.py:68 +msgid "Unable to find user." +msgstr "Такого пользователя нет" + +#: forms.py:74 +msgid "New password" +msgstr "Новый пароль" + +#: forms.py:78 +msgid "New password (confirm)" +msgstr "Новый пароль (подтверждение)" + +#: forms.py:90 +msgid "The two passwords didn't match." +msgstr "Пароли не совпадают" + +#: templates/password_reset/recovery_done.html:3 +msgid "New password set" +msgstr "Новый пароль сохранен" + +#: templates/password_reset/recovery_done.html:6 +msgid "" +"Your password has successfully been reset. You can use it right now on the " +"login page." +msgstr "Ваш пароль был успешно сброшен. Сейчас вы можете авторизоваться с новым паролем" + +#: templates/password_reset/recovery_email.txt:1 +#, python-format +msgid "Dear %(username)s," +msgstr "Уважаемый %(username)s," + +#: templates/password_reset/recovery_email.txt:3 +#, python-format +msgid "" +"You -- or someone pretending to be you -- has requested a password reset on " +"%(domain)s." +msgstr "Вы или кто-то еще, сделал запрос на сброс пароля на сайте %(domain)s." + +#: templates/password_reset/recovery_email.txt:5 +msgid "You can set your new password by following this link:" +msgstr "Вы можете установить новый пароль пройдя по этой ссылке:" + +#: templates/password_reset/recovery_email.txt:9 +msgid "" +"If you don't want to reset your password, simply ignore this email and it " +"will stay unchanged." +msgstr "Если вы не хотете сбрасывать ваш пароль, просто проигнорируйте это сообщение" + +#: templates/password_reset/recovery_email_subject.txt:1 +#, python-format +msgid "Password recovery on %(domain)s" +msgstr "Востановление пароля на сайте %(domain)s" + +#: templates/password_reset/recovery_form.html:5 +msgid "Password recovery" +msgstr "Воставновление пароля" + +#: templates/password_reset/recovery_form.html:11 +msgid "Recover my password" +msgstr "Востановить пароль" + +#: templates/password_reset/reset.html:5 +#, python-format +msgid "" +"Sorry, this password reset link is invalid. You can still request a new one." +msgstr "Извините, эта ссылка для востановление пароля неверная, вы можете сделать новый запрос." + +#: templates/password_reset/reset.html:7 +#, python-format +msgid "Hi, %(username)s. Please choose your new password." +msgstr "Здравствуйте, %(username)s. Пожалуйста задайте новый пароль" + +#: templates/password_reset/reset.html:11 +msgid "Set new password" +msgstr "Установить новый пароль" + +#: templates/password_reset/reset_sent.html:4 +msgid "Password recovery sent" +msgstr "Запрос на востановление пароля отправлен" + +#: templates/password_reset/reset_sent.html:7 +#, python-format +msgid "" +"An email was sent to %(email)s %(ago)s ago. Use the link in " +"it to set a new password." +msgstr "Письмо с инструкциями по востановлению пароля было отправлено на %(email)s %(ago)s назад" diff --git a/password_reset/locale/zh/LC_MESSAGES/django.mo b/password_reset/locale/zh/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..f1f11c350efc46072a3314f8a06d3f5ebd8cce99 GIT binary patch literal 2524 zcmaKs{cjXS7{^CJg^Hs1mKdXxCd4+}9#_N!j?!?n2Q>EO(iaSxsN1`_yOq72V`qwe?DO)S zXXno?>n8}V*Kogq`w!f2;Xd~S9=J9;8Wl!uo)ZyKLURNH-Wx&guDvw z244Up;ESLRO24ACei3{L<6EG#TLh1Szk@O|(*@Lg~n zk~$3T2KOQNaqtU_e|uVeA9;olyb=b6Koi^v=D>~MU!e5+2;2<*1Il_gBj}r8Ehxt! zP}bQ4N;@6=1Uv@54*m{G`$ym_;3hbi{%i4&V;>j<_k(rd=b+6023V4uK+2*f&w}!j zI-$(s1-He$Dh-P{J%<54FV+Y7igD!n^SEWMQa@Rnyiitgf8@K|#~R$S4id5`OX-G5 z`*lGDvmEMh+9({GTZyKvb;Y%M(YU=dL$}uH30^NKo_^XZ79& zE5VR^M^z=O2DC29t+-*Q>Q_%AFo~2(r#6f7Bkw{tQWOSHanJKVr4J6#TvKkP5xD}I}BGZu_9KBV5y_3rFj*bxWAK!|fnF z(A(BVJ3{SY+8AyRwYKdGwX}4FyStlUY9%r#K48b<(Uo*xa!T%L6C# zb7x?gpTF<(uKnbV=G4F&8!t@FEf0-)m+vm+77GhGYciWOpt~O4Y%&t9a-(e zg~G(NcY8`jMM^8#Ro?0f*KI*E=`l<|dT~Qg&2%^M)@k z4V{qH5WunZ3 jvUAG$D#et>-tf44_FG@!{9Oc8!WFK}y9*Nt, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-01-23 10:01+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: forms.py:26 +msgid "Username" +msgstr "用户名" + +#: forms.py:27 +msgid "Email" +msgstr "邮箱" + +#: forms.py:28 +msgid "Username or Email" +msgstr "用户名或者邮箱" + +#: forms.py:48 forms.py:58 forms.py:70 +msgid "Sorry, this user doesn't exist." +msgstr "抱歉,用户名不存在." + +#: forms.py:72 +msgid "Unable to find user." +msgstr "找不到指定用户" + +#: forms.py:78 +msgid "New password" +msgstr "新密码" + +#: forms.py:82 +msgid "New password (confirm)" +msgstr "新密码(确认)" + +#: forms.py:94 +msgid "The two passwords didn't match." +msgstr "两次输入的密码不一致" + +#: templates/password_reset/recovery_done.html:3 +msgid "New password set" +msgstr "设置新密码" + +#: templates/password_reset/recovery_done.html:6 +msgid "" +"Your password has successfully been reset. You can use it right now on the " +"login page." +msgstr "您的密码已经重设成功,现在可以登录了." + +#: templates/password_reset/recovery_email.txt:1 +#, python-format +msgid "Dear %(username)s," +msgstr "您好 %(username)s," + +#: templates/password_reset/recovery_email.txt:3 +#, python-format +msgid "" +"You -- or someone pretending to be you -- has requested a password reset on " +"%(domain)s." +msgstr "您或者其它的人在 %(domain)s 申请了密码重置." + +#: templates/password_reset/recovery_email.txt:5 +msgid "You can set your new password by following this link:" +msgstr "您可以通过以下链接重置密码:" + +#: templates/password_reset/recovery_email.txt:9 +msgid "" +"If you don't want to reset your password, simply ignore this email and it " +"will stay unchanged." +msgstr "如果您不想重设密码,可以忽略此邮箱." + +#: templates/password_reset/recovery_email_subject.txt:1 +#, python-format +msgid "Password recovery on %(domain)s" +msgstr "在 %(domain)s 上重设密码" + +#: templates/password_reset/recovery_form.html:5 +msgid "Password recovery" +msgstr "重新设置密码" + +#: templates/password_reset/recovery_form.html:11 +msgid "Recover my password" +msgstr "重设密码" + +#: templates/password_reset/reset.html:5 +#, python-format +msgid "" +"Sorry, this password reset link is invalid. You can still request a new one." +msgstr "抱歉,链接已经失效,您可以在 请求一个新链接." + +#: templates/password_reset/reset.html:7 +#, python-format +msgid "Hi, %(username)s. Please choose your new password." +msgstr "您好,%(username)s. 请输入您的新密码." + +#: templates/password_reset/reset.html:11 +msgid "Set new password" +msgstr "设置新密码" + +#: templates/password_reset/reset_sent.html:4 +msgid "Password recovery sent" +msgstr "发送重设密码" + +#: templates/password_reset/reset_sent.html:7 +#, python-format +msgid "" +"An email was sent to %(email)s %(ago)s ago. Use the link in " +"it to set a new password." +msgstr "已经在%(ago)s以前向您的邮箱 %(email)s发送了邮件,根据邮件提示重新设置您的新密码." diff --git a/password_reset/signals.py b/password_reset/signals.py new file mode 100644 index 00000000..6bf3823f --- /dev/null +++ b/password_reset/signals.py @@ -0,0 +1,6 @@ +from django.dispatch import Signal + +# signal sent when users successfully recover their passwords +user_recovers_password = Signal( + providing_args=['user', 'request'] +) diff --git a/password_reset/templates/password_reset/base.html b/password_reset/templates/password_reset/base.html new file mode 100644 index 00000000..94d9808c --- /dev/null +++ b/password_reset/templates/password_reset/base.html @@ -0,0 +1 @@ +{% extends "base.html" %} diff --git a/password_reset/templates/password_reset/recovery_done.html b/password_reset/templates/password_reset/recovery_done.html new file mode 100644 index 00000000..4b123c26 --- /dev/null +++ b/password_reset/templates/password_reset/recovery_done.html @@ -0,0 +1,7 @@ +{% extends "password_reset/base.html" %}{% load i18n %} + +{% block title %}{% trans "New password set" %}{% endblock %} + +{% block content %} +

      {% trans "Your password has successfully been reset. You can use it right now on the login page." %}

      +{% endblock %} diff --git a/password_reset/templates/password_reset/recovery_email.txt b/password_reset/templates/password_reset/recovery_email.txt new file mode 100644 index 00000000..a6a44e08 --- /dev/null +++ b/password_reset/templates/password_reset/recovery_email.txt @@ -0,0 +1,9 @@ +{% load i18n %}{% load url from future %}{% blocktrans %}Dear {{ username }},{% endblocktrans %} + +{% blocktrans with domain=site.domain %}You -- or someone pretending to be you -- has requested a password reset on {{ domain }}.{% endblocktrans %} + +{% trans "You can set your new password by following this link:" %} + +http{% if secure %}s{% endif %}://{{ site.domain }}{% url "password_reset_reset" token %} + +{% trans "If you don't want to reset your password, simply ignore this email and it will stay unchanged." %} diff --git a/password_reset/templates/password_reset/recovery_email_subject.txt b/password_reset/templates/password_reset/recovery_email_subject.txt new file mode 100644 index 00000000..1c9bcc23 --- /dev/null +++ b/password_reset/templates/password_reset/recovery_email_subject.txt @@ -0,0 +1 @@ +{% load i18n %}{% blocktrans with domain=site.domain %}Password recovery on {{ domain }}{% endblocktrans %} diff --git a/password_reset/templates/password_reset/recovery_form.html b/password_reset/templates/password_reset/recovery_form.html new file mode 100644 index 00000000..bb84ac27 --- /dev/null +++ b/password_reset/templates/password_reset/recovery_form.html @@ -0,0 +1,13 @@ +{% extends "password_reset/base.html" %} +{% load i18n %} +{% load url from future %} + +{% block title %}{% trans "Password recovery" %}{% endblock %} + +{% block content %} +
      + {% csrf_token %} + {{ form.as_p }} +

      +
      +{% endblock %} diff --git a/password_reset/templates/password_reset/reset.html b/password_reset/templates/password_reset/reset.html new file mode 100644 index 00000000..0fb5d5cf --- /dev/null +++ b/password_reset/templates/password_reset/reset.html @@ -0,0 +1,14 @@ +{% extends "password_reset/base.html" %}{% load i18n %}{% load url from future %} + +{% block content %} + {% if invalid %}{% url "password_reset_recover" as recovery_url %} +

      {% blocktrans %}Sorry, this password reset link is invalid. You can still request a new one.{% endblocktrans %}

      + {% else %} +

      {% blocktrans %}Hi, {{ username }}. Please choose your new password.{% endblocktrans %}

      +
      + {% csrf_token %} + {{ form.as_p }} +

      +
      + {% endif %} +{% endblock %} diff --git a/password_reset/templates/password_reset/reset_sent.html b/password_reset/templates/password_reset/reset_sent.html new file mode 100644 index 00000000..bc56b7c2 --- /dev/null +++ b/password_reset/templates/password_reset/reset_sent.html @@ -0,0 +1,8 @@ +{% extends "password_reset/base.html" %} +{% load i18n %} + +{% block title %}{% trans "Password recovery sent" %}{% endblock %} + +{% block content %} +

      {% blocktrans with ago=timestamp|timesince %}An email was sent to {{ email }} {{ ago }} ago. Use the link in it to set a new password.{% endblocktrans %}

      +{% endblock %} diff --git a/password_reset/tests/__init__.py b/password_reset/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/password_reset/tests/models.py b/password_reset/tests/models.py new file mode 100644 index 00000000..e69de29b diff --git a/password_reset/tests/settings.py b/password_reset/tests/settings.py new file mode 100644 index 00000000..6ed076a1 --- /dev/null +++ b/password_reset/tests/settings.py @@ -0,0 +1,17 @@ +ROOT_URLCONF = 'password_reset.tests.urls' + +SECRET_KEY = 'yo secret yo' + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': 'password_reset.sqlite', + }, +} + +INSTALLED_APPS = ( + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'password_reset', + 'password_reset.tests', +) diff --git a/password_reset/tests/templates/404.html b/password_reset/tests/templates/404.html new file mode 100644 index 00000000..e69de29b diff --git a/password_reset/tests/templates/base.html b/password_reset/tests/templates/base.html new file mode 100644 index 00000000..24132993 --- /dev/null +++ b/password_reset/tests/templates/base.html @@ -0,0 +1,3 @@ +{% block title %}{% endblock %} + +{% block content %}{% endblock %} diff --git a/password_reset/tests/tests.py b/password_reset/tests/tests.py new file mode 100644 index 00000000..473152d4 --- /dev/null +++ b/password_reset/tests/tests.py @@ -0,0 +1,364 @@ +import django + +from django.core import mail +from django.core.urlresolvers import reverse +from django.test import TestCase +from django.test.utils import override_settings +from django.utils import timezone +from django.utils.unittest import SkipTest + +from ..forms import PasswordRecoveryForm, PasswordResetForm +from ..utils import get_user_model + +if django.VERSION >= (1, 5): + from django.contrib.auth.tests.custom_user import ( # noqa + CustomUser, ExtensionUser) +else: + CustomUser = None # noqa + ExtensionUser = None # noqa + + +class CustomUserVariants(type): + def __new__(cls, name, bases, dct): + if django.VERSION >= (1, 5): + for custom_user in ['auth.CustomUser', 'auth.ExtensionUser']: + suffix = custom_user.lower().replace('.', '_') + for key, fn in dct.items(): + if key.startswith('test') and '_CUSTOM_' not in key: + name = '{0}_CUSTOM_{1}'.format(key, suffix) + dct[name] = override_settings( + AUTH_USER_MODEL=custom_user)(fn) + return super(CustomUserVariants, cls).__new__(cls, name, bases, dct) + + +def create_user(): + email = 'bar@example.com' + password = 'pass' + username = 'foo' + model = get_user_model() + kwargs = {} + args = username, email, password + if model is CustomUser: + args = email, timezone.now(), password + elif model is ExtensionUser: + kwargs = {'date_of_birth': timezone.now()} + return get_user_model()._default_manager.create_user(*args, **kwargs) + + +class FormTests(TestCase): + __metaclass__ = CustomUserVariants + + def test_username_input(self): + User = get_user_model() + if User is CustomUser: + raise SkipTest('No username field') + + form = PasswordRecoveryForm() + self.assertFalse(form.is_valid()) + + form = PasswordRecoveryForm(data={'username_or_email': 'inexisting'}) + self.assertFalse(form.is_valid()) + self.assertEqual(form.errors['username_or_email'], + ["Sorry, this user doesn't exist."]) + + create_user() + + form = PasswordRecoveryForm(data={ + 'username_or_email': 'foo', + }) + self.assertTrue(form.is_valid()) + + form = PasswordRecoveryForm(data={ + 'username_or_email': 'FOO', + }) + self.assertFalse(form.is_valid()) + + form = PasswordRecoveryForm(data={ + 'username_or_email': 'FOO', + }, case_sensitive=False) + self.assertTrue(form.is_valid()) + + form = PasswordRecoveryForm(data={ + 'username_or_email': 'bar@example.com', + }) + self.assertTrue(form.is_valid()) + + form = PasswordRecoveryForm(data={ + 'username_or_email': 'bar@example.COM', + }) + self.assertFalse(form.is_valid()) + + form = PasswordRecoveryForm(data={ + 'username_or_email': 'bar@example.COM', + }, case_sensitive=False) + self.assertTrue(form.is_valid()) + + def test_form_custom_search(self): + # Searching only for email does some extra validation + form = PasswordRecoveryForm(data={ + 'username_or_email': 'barexample.com', + }, search_fields=['email']) + self.assertFalse(form.is_valid()) + self.assertTrue(form.errors['username_or_email'] in [ + ['Enter a valid email address.'], + ['Enter a valid e-mail address.'], + ]) + + form = PasswordRecoveryForm(data={ + 'username_or_email': 'bar@example.com', + }, search_fields=['email']) + self.assertFalse(form.is_valid()) + self.assertEqual(form.errors['username_or_email'], + ["Sorry, this user doesn't exist."]) + + user = create_user() + + form = PasswordRecoveryForm(data={ + 'username_or_email': 'test@example.com', + }, search_fields=['email']) + self.assertFalse(form.is_valid()) + self.assertEqual(form.errors['username_or_email'], + ["Sorry, this user doesn't exist."]) + + # Search by actual email works + form = PasswordRecoveryForm(data={ + 'username_or_email': 'bar@example.com', + }, search_fields=['email']) + self.assertTrue(form.is_valid(), form.errors) + + if not hasattr(user, 'username'): + return # skip if no username field + + # Now search by username + user.username = 'username' + user.save() + + form = PasswordRecoveryForm(data={ + 'username_or_email': 'foo@example.com', + }, search_fields=['username']) + self.assertFalse(form.is_valid()) + self.assertEqual(form.errors['username_or_email'], + ["Sorry, this user doesn't exist."]) + + form = PasswordRecoveryForm(data={ + 'username_or_email': 'username', + }, search_fields=['username']) + self.assertTrue(form.is_valid()) + + def test_password_reset_form(self): + user = create_user() + old_sha = user.password + + form = PasswordResetForm(user=user) + self.assertFalse(form.is_valid()) + + form = PasswordResetForm(user=user, data={'password1': 'foo'}) + self.assertFalse(form.is_valid()) + self.assertEqual(form.errors['password2'], + ['This field is required.']) + + form = PasswordResetForm(user=user, data={'password1': 'foo', + 'password2': 'bar'}) + self.assertFalse(form.is_valid()) + self.assertEqual(form.errors['password2'], + ["The two passwords didn't match."]) + + form = PasswordResetForm(user=user, data={'password1': 'foo', + 'password2': 'foo'}) + self.assertTrue(form.is_valid()) + self.assertEqual(user.password, old_sha) + form.save() + self.assertNotEqual(user.password, old_sha) + + def test_form_commit(self): + user = create_user() + old_sha = user.password + + form = PasswordResetForm(user=user, data={'password1': 'foo', + 'password2': 'foo'}) + self.assertTrue(form.is_valid()) + user = form.save(commit=False) + self.assertEqual(get_user_model()._default_manager.get().password, + old_sha) + self.assertNotEqual(old_sha, user.password) + user.save() + self.assertEqual(get_user_model()._default_manager.get().password, + user.password) + + +class ViewTests(TestCase): + __metaclass__ = CustomUserVariants + + def test_recover(self): + self.user = create_user() + url = reverse('password_reset_recover') + response = self.client.get(url) + User = get_user_model() + + if User is CustomUser: + self.assertContains(response, 'Email') + else: + self.assertContains(response, 'Username or Email') + + response = self.client.post(url, + {'username_or_email': 'test@example.com'}) + self.assertContains(response, "Sorry, this user") + + self.assertEqual(len(mail.outbox), 0) + + if User is CustomUser: + value = 'bar@example.com' + else: + value = 'foo' + response = self.client.post(url, {'username_or_email': value}, + follow=True) + self.assertEqual(len(response.redirect_chain), 1) + self.assertContains(response, 'bar@example.com') + + self.assertEqual(len(mail.outbox), 1) + + message = mail.outbox[0] + + self.assertEqual(message.subject, + u'Password recovery on testserver') + + if User is CustomUser: + self.assertTrue('Dear bar@example.com,' in message.body) + else: + self.assertTrue('Dear foo,' in message.body) + + url = message.body.split('http://testserver')[1].split('\n', 1)[0] + + response = self.client.get(url) + self.assertContains(response, 'New password (confirm)') + if User is CustomUser: + self.assertContains(response, + 'Hi, bar@example.com') + else: + self.assertContains(response, 'Hi, foo') + + data = {'password1': 'foo', + 'password2': 'foo'} + response = self.client.post(url, data, follow=True) + self.assertEqual(len(response.redirect_chain), 1) + self.assertContains(response, + "Your password has successfully been reset.") + + self.assertTrue( + get_user_model()._default_manager.get().check_password('foo')) + + def test_invalid_reset_link(self): + url = reverse('password_reset_reset', args=['foobar-invalid']) + + response = self.client.get(url) + self.assertContains(response, + "Sorry, this password reset link is invalid") + + def test_email_recover(self): + self.user = create_user() + url = reverse('email_recover') + response = self.client.get(url) + self.assertNotContains(response, "Username or Email") + self.assertContains(response, "Email:") + + response = self.client.post(url, {'username_or_email': 'foo'}) + try: + self.assertContains(response, "Enter a valid email address") + except AssertionError: + self.assertContains(response, "Enter a valid e-mail address") + + response = self.client.post(url, {'username_or_email': 'foo@ex.com'}) + self.assertContains(response, "Sorry, this user") + + self.assertEqual(len(mail.outbox), 0) + response = self.client.post( + url, {'username_or_email': 'bar@example.com'}, follow=True, + ) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(len(response.redirect_chain), 1) + self.assertContains(response, 'bar@example.com') + + def test_username_recover(self): + if get_user_model() is CustomUser: + raise SkipTest("No username field") + self.user = create_user() + url = reverse('username_recover') + response = self.client.get(url) + + self.assertNotContains(response, "Username or Email") + self.assertContains(response, "Username:") + + response = self.client.post(url, + {'username_or_email': 'bar@example.com'}) + self.assertContains(response, "Sorry, this user") + + self.assertEqual(len(mail.outbox), 0) + response = self.client.post( + url, {'username_or_email': 'foo'}, follow=True, + ) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(len(response.redirect_chain), 1) + self.assertContains(response, 'foo') + + def test_invalid_signature(self): + url = reverse('password_reset_sent', + kwargs={'signature': 'test@example.com:122323333'}) + response = self.client.get(url) + self.assertEqual(response.status_code, 404) + + def test_content_redirection(self): + self.user = create_user() + url = reverse('email_recover') + response = self.client.get(url) + + response = self.client.post( + url, {'username_or_email': 'bar@example.com'}, follow=True, + ) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(len(response.redirect_chain), 1) + self.assertContains(response, 'bar@example.com') + + if get_user_model() is CustomUser: + return # no username field + + url = reverse('username_recover') + response = self.client.post( + url, {'username_or_email': 'foo'}, follow=True, + ) + self.assertEqual(len(mail.outbox), 2) + self.assertEqual(len(response.redirect_chain), 1) + self.assertContains(response, 'foo') + + def test_insensitive_recover(self): + self.user = create_user() + url = reverse('insensitive_recover') + response = self.client.get(url) + normalized = 'bar@example.com' + + User = get_user_model() + if User is CustomUser: + self.assertContains(response, 'Email') + else: + self.assertContains(response, 'Username or Email') + self.assertEqual(len(mail.outbox), 0) + + value = 'BAR@example.COM' if User is CustomUser else 'FOO' + response = self.client.post(url, {'username_or_email': value}, + follow=True) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(len(response.redirect_chain), 1) + self.assertContains(response, normalized) + + response = self.client.post( + url, {'username_or_email': 'bar@EXAmPLE.coM'}, follow=True, + ) + self.assertEqual(len(mail.outbox), 2) + self.assertEqual(len(response.redirect_chain), 1) + self.assertContains(response, normalized) + + response = self.client.post( + url, {'username_or_email': 'bar@example.com'}, follow=True, + ) + self.assertEqual(len(mail.outbox), 3) + self.assertEqual(len(response.redirect_chain), 1) + self.assertContains(response, normalized) diff --git a/password_reset/tests/urls.py b/password_reset/tests/urls.py new file mode 100644 index 00000000..5bb5590c --- /dev/null +++ b/password_reset/tests/urls.py @@ -0,0 +1,13 @@ +from django.conf.urls import url, patterns + +from ..urls import urlpatterns +from . import views + +urlpatterns += patterns( + '', + url(r'^email_recover/$', views.email_recover, name='email_recover'), + url(r'^username_recover/$', views.username_recover, + name='username_recover'), + url(r'^insensitive_recover/$', views.insensitive_recover, + name='insensitive_recover'), +) diff --git a/password_reset/tests/views.py b/password_reset/tests/views.py new file mode 100644 index 00000000..9927bdc8 --- /dev/null +++ b/password_reset/tests/views.py @@ -0,0 +1,16 @@ +from .. import views + + +class EmailRecover(views.Recover): + search_fields = ['email'] +email_recover = EmailRecover.as_view() + + +class UsernameRecover(views.Recover): + search_fields = ['username'] +username_recover = UsernameRecover.as_view() + + +class InsensitiveRecover(views.Recover): + case_sensitive = False +insensitive_recover = InsensitiveRecover.as_view() diff --git a/password_reset/urls.py b/password_reset/urls.py new file mode 100644 index 00000000..7a756ac2 --- /dev/null +++ b/password_reset/urls.py @@ -0,0 +1,14 @@ +from django.conf.urls import url, patterns + +from . import views + + +urlpatterns = patterns( + '', + url(r'^recover/(?P.+)/$', views.recover_done, + name='password_reset_sent'), + url(r'^recover/$', views.recover, name='password_reset_recover'), + url(r'^reset/done/$', views.reset_done, name='password_reset_done'), + url(r'^reset/(?P[\w:-]+)/$', views.reset, + name='password_reset_reset'), +) diff --git a/password_reset/utils.py b/password_reset/utils.py new file mode 100644 index 00000000..6200970f --- /dev/null +++ b/password_reset/utils.py @@ -0,0 +1,10 @@ +try: + from django.contrib.auth import get_user_model +except ImportError: + from django.contrib.auth.models import User + get_user_model = lambda: User # noqa + + +def get_username(user): + username_field = getattr(user, 'USERNAME_FIELD', 'username') + return getattr(user, username_field) diff --git a/password_reset/views.py b/password_reset/views.py new file mode 100644 index 00000000..88b84a07 --- /dev/null +++ b/password_reset/views.py @@ -0,0 +1,164 @@ +import datetime + +from django.conf import settings +from django.contrib.sites.models import Site, RequestSite +from django.core import signing +from django.core.mail import send_mail +from django.core.urlresolvers import reverse, reverse_lazy +from django.shortcuts import get_object_or_404, redirect +from django.http import Http404 +from django.template import loader +from django.utils import timezone +from django.views import generic + +from .forms import PasswordRecoveryForm, PasswordResetForm +from .utils import get_user_model, get_username +from .signals import user_recovers_password + + +class SaltMixin(object): + salt = 'password_recovery' + url_salt = 'password_recovery_url' + + +def loads_with_timestamp(value, salt): + """Returns the unsigned value along with its timestamp, the time when it + got dumped.""" + try: + signing.loads(value, salt=salt, max_age=-1) + except signing.SignatureExpired as e: + age = float(str(e).split('Signature age ')[1].split(' >')[0]) + timestamp = timezone.now() - datetime.timedelta(seconds=age) + return timestamp, signing.loads(value, salt=salt) + + +class RecoverDone(SaltMixin, generic.TemplateView): + template_name = "password_reset/reset_sent.html" + + def get_context_data(self, **kwargs): + ctx = super(RecoverDone, self).get_context_data(**kwargs) + try: + ctx['timestamp'], ctx['email'] = loads_with_timestamp( + self.kwargs['signature'], salt=self.url_salt, + ) + except signing.BadSignature: + raise Http404 + return ctx +recover_done = RecoverDone.as_view() + + +class Recover(SaltMixin, generic.FormView): + case_sensitive = True + form_class = PasswordRecoveryForm + template_name = 'password_reset/recovery_form.html' + success_url_name = 'password_reset_sent' + email_template_name = 'password_reset/recovery_email.txt' + email_subject_template_name = 'password_reset/recovery_email_subject.txt' + search_fields = ['username', 'email'] + + def get_success_url(self): + return reverse(self.success_url_name, args=[self.mail_signature]) + + def get_context_data(self, **kwargs): + kwargs['url'] = self.request.get_full_path() + return super(Recover, self).get_context_data(**kwargs) + + def get_form_kwargs(self): + kwargs = super(Recover, self).get_form_kwargs() + kwargs.update({ + 'case_sensitive': self.case_sensitive, + 'search_fields': self.search_fields, + }) + return kwargs + + def get_site(self): + if Site._meta.installed: + return Site.objects.get_current() + else: + return RequestSite(self.request) + + def send_notification(self): + context = { + 'site': self.get_site(), + 'user': self.user, + 'username': get_username(self.user), + 'token': signing.dumps(self.user.pk, salt=self.salt), + 'secure': self.request.is_secure(), + } + body = loader.render_to_string(self.email_template_name, + context).strip() + subject = loader.render_to_string(self.email_subject_template_name, + context).strip() + send_mail(subject, body, settings.DEFAULT_FROM_EMAIL, + [self.user.email]) + + def form_valid(self, form): + self.user = form.cleaned_data['user'] + self.send_notification() + if ( + len(self.search_fields) == 1 and + self.search_fields[0] == 'username' + ): + # if we only search by username, don't disclose the user email + # since it may now be public information. + email = self.user.username + else: + email = self.user.email + self.mail_signature = signing.dumps(email, salt=self.url_salt) + return super(Recover, self).form_valid(form) +recover = Recover.as_view() + + +class Reset(SaltMixin, generic.FormView): + form_class = PasswordResetForm + token_expires = 3600 * 48 # Two days + template_name = 'password_reset/reset.html' + success_url = reverse_lazy('password_reset_done') + + def dispatch(self, request, *args, **kwargs): + self.request = request + self.args = args + self.kwargs = kwargs + + try: + pk = signing.loads(kwargs['token'], max_age=self.token_expires, + salt=self.salt) + except signing.BadSignature: + return self.invalid() + + self.user = get_object_or_404(get_user_model(), pk=pk) + return super(Reset, self).dispatch(request, *args, **kwargs) + + def invalid(self): + return self.render_to_response(self.get_context_data(invalid=True)) + + def get_form_kwargs(self): + kwargs = super(Reset, self).get_form_kwargs() + kwargs['user'] = self.user + return kwargs + + def get_context_data(self, **kwargs): + ctx = super(Reset, self).get_context_data(**kwargs) + if 'invalid' not in ctx: + ctx.update({ + 'username': get_username(self.user), + 'token': self.kwargs['token'], + }) + return ctx + + def form_valid(self, form): + form.save() + user_recovers_password.send( + sender=get_user_model(), + user=form.user, + request=self.request + ) + return redirect(self.get_success_url()) +reset = Reset.as_view() + + +class ResetDone(generic.TemplateView): + template_name = 'password_reset/recovery_done.html' + + +reset_done = ResetDone.as_view() diff --git a/photologue/__init__.py b/photologue/__init__.py new file mode 100644 index 00000000..c62ecd7c --- /dev/null +++ b/photologue/__init__.py @@ -0,0 +1,5 @@ +import os + +__version__ = '3.0.dev0' + +PHOTOLOGUE_APP_DIR = os.path.dirname(os.path.abspath(__file__)) diff --git a/photologue/admin.py b/photologue/admin.py new file mode 100644 index 00000000..cd3101e7 --- /dev/null +++ b/photologue/admin.py @@ -0,0 +1,254 @@ +from django import forms +from django.conf import settings +from django.contrib import admin +from django.contrib.sites.models import Site +from django.contrib import messages +from django.utils.translation import ungettext, ugettext_lazy as _ + +from .models import Gallery, Photo, GalleryUpload, PhotoEffect, PhotoSize, \ + Watermark + +MULTISITE = getattr(settings, 'PHOTOLOGUE_MULTISITE', False) + +ENABLE_TAGS = getattr(settings, 'PHOTOLOGUE_ENABLE_TAGS', False) + + +class GalleryAdminForm(forms.ModelForm): + + class Meta: + model = Gallery + if MULTISITE: + exclude = [] + else: + exclude = ['sites'] + if not ENABLE_TAGS: + exclude.append('tags') + + +class GalleryAdmin(admin.ModelAdmin): + list_display = ('title', 'date_added', 'photo_count', 'is_public') + list_filter = ['date_added', 'is_public'] + if MULTISITE: + list_filter.append('sites') + date_hierarchy = 'date_added' + prepopulated_fields = {'slug': ('title',)} + form = GalleryAdminForm + if MULTISITE: + filter_horizontal = ['sites'] + if MULTISITE: + actions = [ + 'add_to_current_site', + 'add_photos_to_current_site', + 'remove_from_current_site', + 'remove_photos_from_current_site' + ] + + def formfield_for_manytomany(self, db_field, request, **kwargs): + """ Set the current site as initial value. """ + if db_field.name == "sites": + kwargs["initial"] = [Site.objects.get_current()] + return super(GalleryAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) + + def save_related(self, request, form, *args, **kwargs): + """ + If the user has saved a gallery with a photo that belongs only to + different Sites - it might cause much confusion. So let them know. + """ + super(GalleryAdmin, self).save_related(request, form, *args, **kwargs) + orphaned_photos = form.instance.orphaned_photos() + if orphaned_photos: + msg = ungettext( + 'The following photo does not belong to the same site(s)' + ' as the gallery, so will never be displayed: %(photo_list)s.', + 'The following photos do not belong to the same site(s)' + ' as the gallery, so will never be displayed: %(photo_list)s.', + len(orphaned_photos) + ) % {'photo_list': ", ".join([photo.title for photo in orphaned_photos])} + messages.warning(request, msg) + + def add_to_current_site(modeladmin, request, queryset): + current_site = Site.objects.get_current() + current_site.gallery_set.add(*queryset) + msg = ungettext( + "The gallery has been successfully added to %(site)s", + "The galleries have been successfully added to %(site)s", + len(queryset) + ) % {'site': current_site.name} + messages.success(request, msg) + + add_to_current_site.short_description = \ + _("Add selected galleries from the current site") + + def remove_from_current_site(modeladmin, request, queryset): + current_site = Site.objects.get_current() + current_site.gallery_set.remove(*queryset) + msg = ungettext( + "The gallery has been successfully removed from %(site)s", + "The selected galleries have been successfully removed from %(site)s", + len(queryset) + ) % {'site': current_site.name} + messages.success(request, msg) + + remove_from_current_site.short_description = \ + _("Remove selected galleries from the current site") + + def add_photos_to_current_site(modeladmin, request, queryset): + photos = Photo.objects.filter(galleries__in=queryset) + current_site = Site.objects.get_current() + current_site.photo_set.add(*photos) + msg = ungettext( + 'All photos in gallery %(galleries)s have been successfully added to %(site)s', + 'All photos in galleries %(galleries)s have been successfully added to %(site)s', + len(queryset) + ) % { + 'site': current_site.name, + 'galleries': ", ".join(["'{0}'".format(gallery.title) + for gallery in queryset]) + } + messages.success(request, msg) + + add_photos_to_current_site.short_description = \ + _("Add all photos of selected galleries to the current site") + + def remove_photos_from_current_site(modeladmin, request, queryset): + photos = Photo.objects.filter(galleries__in=queryset) + current_site = Site.objects.get_current() + current_site.photo_set.remove(*photos) + msg = ungettext( + 'All photos in gallery %(galleries)s have been successfully removed from %(site)s', + 'All photos in galleries %(galleries)s have been successfully removed from %(site)s', + len(queryset) + ) % { + 'site': current_site.name, + 'galleries': ", ".join(["'{0}'".format(gallery.title) + for gallery in queryset]) + } + messages.success(request, msg) + + remove_photos_from_current_site.short_description = \ + _("Remove all photos in selected galleries from the current site") + +admin.site.register(Gallery, GalleryAdmin) + + +class GalleryUploadAdmin(admin.ModelAdmin): + + def has_change_permission(self, request, obj=None): + return False # To remove the 'Save and continue editing' button + + def save_model(self, request, obj, form, change): + # Warning the user when things go wrong in a zip upload. + obj.request = request + obj.save() + +admin.site.register(GalleryUpload, GalleryUploadAdmin) + + +class PhotoAdminForm(forms.ModelForm): + + class Meta: + model = Photo + if MULTISITE: + exclude = [] + else: + exclude = ['sites'] + if not ENABLE_TAGS: + exclude.append('tags') + + +class PhotoAdmin(admin.ModelAdmin): + list_display = ('title', 'date_taken', 'date_added', + 'is_public', 'tags', 'view_count', 'admin_thumbnail') + list_filter = ['date_added', 'is_public'] + if MULTISITE: + list_filter.append('sites') + search_fields = ['title', 'slug', 'caption'] + list_per_page = 10 + prepopulated_fields = {'slug': ('title',)} + form = PhotoAdminForm + if MULTISITE: + filter_horizontal = ['sites'] + if MULTISITE: + actions = ['add_photos_to_current_site', 'remove_photos_from_current_site'] + + def formfield_for_manytomany(self, db_field, request, **kwargs): + """ Set the current site as initial value. """ + if db_field.name == "sites": + kwargs["initial"] = [Site.objects.get_current()] + return super(PhotoAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) + + def add_photos_to_current_site(modeladmin, request, queryset): + current_site = Site.objects.get_current() + current_site.photo_set.add(*queryset) + msg = ungettext( + 'The photo has been successfully added to %(site)s', + 'The selected photos have been successfully added to %(site)s', + len(queryset) + ) % {'site': current_site.name} + messages.success(request, msg) + + add_photos_to_current_site.short_description = \ + _("Add selected photos to the current site") + + def remove_photos_from_current_site(modeladmin, request, queryset): + current_site = Site.objects.get_current() + current_site.photo_set.remove(*queryset) + msg = ungettext( + 'The photo has been successfully removed from %(site)s', + 'The selected photos have been successfully removed from %(site)s', + len(queryset) + ) % {'site': current_site.name} + messages.success(request, msg) + + remove_photos_from_current_site.short_description = \ + _("Remove selected photos from the current site") + +admin.site.register(Photo, PhotoAdmin) + + +class PhotoEffectAdmin(admin.ModelAdmin): + list_display = ('name', 'description', 'color', 'brightness', + 'contrast', 'sharpness', 'filters', 'admin_sample') + fieldsets = ( + (None, { + 'fields': ('name', 'description') + }), + ('Adjustments', { + 'fields': ('color', 'brightness', 'contrast', 'sharpness') + }), + ('Filters', { + 'fields': ('filters',) + }), + ('Reflection', { + 'fields': ('reflection_size', 'reflection_strength', 'background_color') + }), + ('Transpose', { + 'fields': ('transpose_method',) + }), + ) + +admin.site.register(PhotoEffect, PhotoEffectAdmin) + + +class PhotoSizeAdmin(admin.ModelAdmin): + list_display = ('name', 'width', 'height', 'crop', 'pre_cache', 'effect', 'increment_count') + fieldsets = ( + (None, { + 'fields': ('name', 'width', 'height', 'quality') + }), + ('Options', { + 'fields': ('upscale', 'crop', 'pre_cache', 'increment_count') + }), + ('Enhancements', { + 'fields': ('effect', 'watermark',) + }), + ) + +admin.site.register(PhotoSize, PhotoSizeAdmin) + + +class WatermarkAdmin(admin.ModelAdmin): + list_display = ('name', 'opacity', 'style') + + +admin.site.register(Watermark, WatermarkAdmin) diff --git a/photologue/contrib/old_style_templates/templates/photologue/gallery_archive.html b/photologue/contrib/old_style_templates/templates/photologue/gallery_archive.html new file mode 100644 index 00000000..b2eb34cd --- /dev/null +++ b/photologue/contrib/old_style_templates/templates/photologue/gallery_archive.html @@ -0,0 +1,27 @@ +{% extends "photologue/root.html" %} +{% load url from future %} + +{% block title %}Latest Photo Galleries{% endblock %} + +{% block content %} + +

      Latest Photo Galleries

      + +{% if latest %} + {% for gallery in latest %} + + {% endfor %} +{% else %} +

      No galleries were found.

      +{% endif %} + +

      View all galleries.

      + +{% endblock %} diff --git a/photologue/contrib/old_style_templates/templates/photologue/gallery_archive_day.html b/photologue/contrib/old_style_templates/templates/photologue/gallery_archive_day.html new file mode 100644 index 00000000..fc976f35 --- /dev/null +++ b/photologue/contrib/old_style_templates/templates/photologue/gallery_archive_day.html @@ -0,0 +1,27 @@ +{% extends "photologue/root.html" %} +{% load url from future %} + +{% block title %}Galleries for {{ day|date }}{% endblock %} + +{% block content %} + +

      Galleries for {{ day|date }}

      + +{% if object_list %} + {% for gallery in object_list %} + + {% endfor %} +{% else %} +

      No galleries were found.

      +{% endif %} + +

      View all galleries.

      + +{% endblock %} diff --git a/photologue/contrib/old_style_templates/templates/photologue/gallery_archive_month.html b/photologue/contrib/old_style_templates/templates/photologue/gallery_archive_month.html new file mode 100644 index 00000000..44181f56 --- /dev/null +++ b/photologue/contrib/old_style_templates/templates/photologue/gallery_archive_month.html @@ -0,0 +1,27 @@ +{% extends "photologue/root.html" %} +{% load url from future %} + +{% block title %}Galleries for {{ month|date:"F Y" }}{% endblock %} + +{% block content %} + +

      Galleries for {{ month|date:"F Y" }}

      + +{% if object_list %} + {% for gallery in object_list %} + + {% endfor %} +{% else %} +

      No galleries were found.

      +{% endif %} + +

      View all galleries.

      + +{% endblock %} diff --git a/photologue/contrib/old_style_templates/templates/photologue/gallery_archive_year.html b/photologue/contrib/old_style_templates/templates/photologue/gallery_archive_year.html new file mode 100644 index 00000000..f4382c7e --- /dev/null +++ b/photologue/contrib/old_style_templates/templates/photologue/gallery_archive_year.html @@ -0,0 +1,17 @@ +{% extends "photologue/root.html" %} +{% load url from future %} + +{% block title %}Galleries for {{ year }}{% endblock %} + +{% block content %} + +

      Galleries for {{ year }}

      + + +

      View all galleries.

      + +{% endblock %} diff --git a/photologue/contrib/old_style_templates/templates/photologue/gallery_detail.html b/photologue/contrib/old_style_templates/templates/photologue/gallery_detail.html new file mode 100644 index 00000000..9bf7d909 --- /dev/null +++ b/photologue/contrib/old_style_templates/templates/photologue/gallery_detail.html @@ -0,0 +1,20 @@ +{% extends "photologue/root.html" %} +{% load url from future %} + +{% block title %}{{ object.title }}{% endblock %} + +{% block content %} + +

      {{ object.title }}

      +

      Originally published {{ object.date_added|date:"l, F jS, Y" }}

      +{% if object.description %}

      {{ object.description }}

      {% endif %} + +

      View all galleries

      + +{% endblock %} diff --git a/photologue/contrib/old_style_templates/templates/photologue/gallery_list.html b/photologue/contrib/old_style_templates/templates/photologue/gallery_list.html new file mode 100644 index 00000000..847bc783 --- /dev/null +++ b/photologue/contrib/old_style_templates/templates/photologue/gallery_list.html @@ -0,0 +1,34 @@ +{% extends "photologue/root.html" %} +{% load url from future %} + +{% block title %}All Galleries{% endblock %} + +{% block content %} + +

      All galleries

      + +{% if object_list %} + {% for gallery in object_list %} + + {% endfor %} +{% else %} +

      No galleries were found.

      +{% endif %} + +{% if is_paginated %} +

      {{ page_obj.paginator.count }} galleries total.

      +
      +

      {% if page_obj.has_previous %} + Previous | {% endif %} page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }} {% if page_obj.has_next %}| Next{% endif %} +

      +
      +{% endif %} + +{% endblock %} diff --git a/photologue/contrib/old_style_templates/templates/photologue/photo_archive.html b/photologue/contrib/old_style_templates/templates/photologue/photo_archive.html new file mode 100644 index 00000000..090fd6ad --- /dev/null +++ b/photologue/contrib/old_style_templates/templates/photologue/photo_archive.html @@ -0,0 +1,21 @@ +{% extends "photologue/root.html" %} +{% load url from future %} + +{% block title %}Latest Photos{% endblock %} + +{% block content %} + +

      Latest Photos

      + +{% if latest %} + {% for photo in latest %} + + {% endfor %} +{% else %} +

      No photos were found.

      +{% endif %} +

      View all photographs

      + +{% endblock %} diff --git a/photologue/contrib/old_style_templates/templates/photologue/photo_archive_day.html b/photologue/contrib/old_style_templates/templates/photologue/photo_archive_day.html new file mode 100644 index 00000000..2b6c18f8 --- /dev/null +++ b/photologue/contrib/old_style_templates/templates/photologue/photo_archive_day.html @@ -0,0 +1,21 @@ +{% extends "photologue/root.html" %} +{% load url from future %} + +{% block title %}Photos for {{ day|date }}{% endblock %} + +{% block content %} + +

      Photos for {{ day|date }}

      + +{% if object_list %} + {% for photo in object_list %} + + {% endfor %} +{% else %} +

      No photos were found.

      +{% endif %} +

      View all photographs

      + +{% endblock %} diff --git a/photologue/contrib/old_style_templates/templates/photologue/photo_archive_month.html b/photologue/contrib/old_style_templates/templates/photologue/photo_archive_month.html new file mode 100644 index 00000000..e6fbcf8d --- /dev/null +++ b/photologue/contrib/old_style_templates/templates/photologue/photo_archive_month.html @@ -0,0 +1,21 @@ +{% extends "photologue/root.html" %} +{% load url from future %} + +{% block title %}Photos for {{ month|date:"F Y" }}{% endblock %} + +{% block content %} + +

      Photos for {{ month|date:"F Y" }}

      + +{% if object_list %} + {% for photo in object_list %} + + {% endfor %} +{% else %} +

      No photos were found.

      +{% endif %} +

      View all photographs

      + +{% endblock %} diff --git a/photologue/contrib/old_style_templates/templates/photologue/photo_archive_year.html b/photologue/contrib/old_style_templates/templates/photologue/photo_archive_year.html new file mode 100644 index 00000000..2b85db76 --- /dev/null +++ b/photologue/contrib/old_style_templates/templates/photologue/photo_archive_year.html @@ -0,0 +1,14 @@ +{% extends "photologue/root.html" %} + +{% block title %}Galleries for {{ year }}{% endblock %} + +{% block content %} + +

      Photos for {{ year }}

      + + +{% endblock %} diff --git a/photologue/contrib/old_style_templates/templates/photologue/photo_detail.html b/photologue/contrib/old_style_templates/templates/photologue/photo_detail.html new file mode 100644 index 00000000..c76211b5 --- /dev/null +++ b/photologue/contrib/old_style_templates/templates/photologue/photo_detail.html @@ -0,0 +1,23 @@ +{% extends "photologue/root.html" %} + +{% load photologue_tags %} + +{% block title %}{{ object.title }}{% endblock %} + +{% block content %} + +

      {{ object.title }}

      + +{% if object.public_galleries %} +

      This photo is found in the following galleries:

      +
        +{% for gallery in object.public_galleries %} +
      1. {%previous_in_gallery object gallery%} {{ gallery.title }} {%next_in_gallery object gallery%}
      2. +{% endfor %} +
      +{% endif %} + +{% endblock %} diff --git a/photologue/contrib/old_style_templates/templates/photologue/photo_list.html b/photologue/contrib/old_style_templates/templates/photologue/photo_list.html new file mode 100644 index 00000000..bef59742 --- /dev/null +++ b/photologue/contrib/old_style_templates/templates/photologue/photo_list.html @@ -0,0 +1,27 @@ +{% extends "photologue/root.html" %} +{% load url from future %} + +{% block title %}All Photos{% endblock %} + +{% block content %} + +

      All Photos

      + +{% if object_list %} + {% for photo in object_list %} + + {% endfor %} +{% else %} +

      No photos were found.

      +{% endif %} + +{% if is_paginated %} +

      {{ paginator.count }} photos total.

      +
      +

      {% if page_obj.has_previous %}Previous | {% endif %} page {{ page_obj.number }} of {{ paginator.num_pages }} {% if page_obj.has_next %}| Next{% endif %}

      +
      +{% endif %} + +{% endblock %} diff --git a/photologue/contrib/old_style_templates/templates/photologue/root.html b/photologue/contrib/old_style_templates/templates/photologue/root.html new file mode 100644 index 00000000..63913c18 --- /dev/null +++ b/photologue/contrib/old_style_templates/templates/photologue/root.html @@ -0,0 +1 @@ +{% extends "base.html" %} \ No newline at end of file diff --git a/photologue/contrib/old_style_templates/templates/photologue/tags/next_in_gallery.html b/photologue/contrib/old_style_templates/templates/photologue/tags/next_in_gallery.html new file mode 100644 index 00000000..1cb53b33 --- /dev/null +++ b/photologue/contrib/old_style_templates/templates/photologue/tags/next_in_gallery.html @@ -0,0 +1,3 @@ +{% if photo %} + +{% endif %} \ No newline at end of file diff --git a/photologue/contrib/old_style_templates/templates/photologue/tags/prev_in_gallery.html b/photologue/contrib/old_style_templates/templates/photologue/tags/prev_in_gallery.html new file mode 100644 index 00000000..1cb53b33 --- /dev/null +++ b/photologue/contrib/old_style_templates/templates/photologue/tags/prev_in_gallery.html @@ -0,0 +1,3 @@ +{% if photo %} + +{% endif %} \ No newline at end of file diff --git a/photologue/locale/cs/LC_MESSAGES/django.mo b/photologue/locale/cs/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..5def9a6e51a015e583f68765fc42a648cc1ded6b GIT binary patch literal 9634 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 myRiH2VW;p387QelGe2z=>~Ir9h{Hb99u0Su, 2013 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-25 09:56+0000\n" +"PO-Revision-Date: 2013-11-20 11:06+0000\n" +"Last-Translator: QB \n" +"Language-Team: Czech (http://www.transifex.com/projects/p/django-photologue/" +"language/cs/)\n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "" +"Jednotlivé tagy oddělte mezerami, víceslovné tagy uzavřete do úvozovek." + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "" +"Aplikace Django-tagging není nainstalovaná, tagy budou brány jako prostý " +"text." + +#: models.py:115 +msgid "Very Low" +msgstr "Velmi nízká" + +#: models.py:116 +msgid "Low" +msgstr "Nízká" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Nížší střední" + +#: models.py:118 +msgid "Medium" +msgstr "Střední" + +#: models.py:119 +msgid "Medium-High" +msgstr "Vyšší střední" + +#: models.py:120 +msgid "High" +msgstr "Vysoká" + +#: models.py:121 +msgid "Very High" +msgstr "Velmi vysoká" + +#: models.py:126 +msgid "Top" +msgstr "Nahoře" + +#: models.py:127 +msgid "Right" +msgstr "Vpravo" + +#: models.py:128 +msgid "Bottom" +msgstr "Dole" + +#: models.py:129 +msgid "Left" +msgstr "Vlevo" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Uprostřed (výchozí)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Obrátit vodorovně" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Obrátit svisle" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Otočit o 90 stupňů vlevo" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "Otočit o 90 stupňů vpravo" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "Otočit o 180 stupňů" + +#: models.py:142 +msgid "Tile" +msgstr "Dláždit" + +#: models.py:143 +msgid "Scale" +msgstr "Přizpůsobit velikost" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" +"Zřetězte více filtrů použitím vzoru „PRVNI_FILTR->DRUHY_FILTR-" +">TRETI_FILTR“.\n" +"Filtry budou aplikovány v daném pořadí. K dispozici jsou tyto filtry: %s." + +#: models.py:159 +msgid "date published" +msgstr "datum zveřejnění" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "název" + +#: models.py:164 +msgid "title slug" +msgstr "identifikátor" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "Unikátní název, který bude použit v URL adrese (bez diakritiky)." + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "popis" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "veřejné" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Veřejné fotogalerie budou zobrazeny ve výchozích pohledech." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "fotografie" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "tagy" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "fotogalerie" + +#: models.py:188 +msgid "galleries" +msgstr "fotogalerie" + +#: models.py:225 +msgid "count" +msgstr "počet" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "archiv s obrázky (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "" +"Vyberte soubor s příponou .zip, jehož obsah má být nahrán do nové " +"fotogalerie." + +#: models.py:252 +#, fuzzy +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" +"Všem obrázkům ve fotogalerii budou automaticky nastaveny názvy ve tvaru " +"„název galerie + pořadové číslo“." + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" +"Vyberte fotogalerii, do které se mají tyto obrázky přidat. Ponechte prázdné " +"pro vytvoření nové fotogalerie s daným názvem." + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "titulek" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "Titulek bude přidán ke všem fotografiím." + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "Popis této fotogalerie." + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" +"Zrušte zaškrtnutí, pokud chcete, aby byla nově nahraná fotogalerie neveřejná." + +#: models.py:276 +msgid "gallery upload" +msgstr "nahrání celé fotogalerie" + +#: models.py:277 +msgid "gallery uploads" +msgstr "nahrání celé fotogalerie" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "obrázek" + +#: models.py:395 +msgid "date taken" +msgstr "datum pořízení" + +#: models.py:399 +msgid "view count" +msgstr "počet zobrazení" + +#: models.py:402 +msgid "crop from" +msgstr "oříznout" + +#: models.py:411 +msgid "effect" +msgstr "efekt" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Velikost „admin_thumbnail“ není definovaná." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Náhled" + +#: models.py:649 +msgid "slug" +msgstr "identifikátor" + +#: models.py:654 +msgid "date added" +msgstr "datum přidání" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "Veřejné fotografie budou zobrazeny ve výchozích pohledech." + +#: models.py:668 +msgid "photo" +msgstr "fotografie" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "název" + +#: models.py:801 +msgid "rotate or flip" +msgstr "obrátit nebo otočit" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "barva" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" +"Hodnota 0,0 udělá černobílý obrázek, hodnota 1,0 zachová původní barvy." + +#: models.py:808 +msgid "brightness" +msgstr "jas" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "Hodnota 0,0 udělá černý obrázek, hodnota 1,0 zachová původní jas." + +#: models.py:811 +msgid "contrast" +msgstr "kontrast" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "Hodnota 0,0 udělá šedý obrázek, hodnota 1,0 zachová původní kontrast." + +#: models.py:814 +msgid "sharpness" +msgstr "ostrost" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Hodnota 0,0 udělá rozmazaný obrázek, hodnota 1,0 zachová původní ostrost." + +#: models.py:817 +msgid "filters" +msgstr "filtry" + +#: models.py:821 +msgid "size" +msgstr "velikost" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"Výška odrazu jako podíl výšky původního obrázku. Hodnota 0.0 nepřidá žádný " +"odraz, hodnota 1.0 přidá odraz stejně vysoký, jako původní obrázek." + +#: models.py:824 +msgid "strength" +msgstr "intenzita" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "Počáteční intenzita postupně slábnoucího odrazu." + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "Barva pozadí odrazu. Nastavte na barvu pozadí stránky." + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "efekt" + +#: models.py:834 +msgid "photo effects" +msgstr "efekty" + +#: models.py:865 +msgid "style" +msgstr "styl" + +#: models.py:869 +msgid "opacity" +msgstr "krytí" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "Neprůhlednost překrývajícího obrázku." + +#: models.py:874 +msgid "watermark" +msgstr "vodotisk" + +#: models.py:875 +msgid "watermarks" +msgstr "vodotisky" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"Název velikosti by měl obsahovat pouze písmena, číslice a podtržítka. " +"Například: „nahled“, „male_zobrazeni“, „velke_zobrazeni“." + +#: models.py:898 +msgid "width" +msgstr "šířka" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" +"Pokud je šířka nastavena na 0, velikost obrázku bude upravena podle zadané " +"výšky." + +#: models.py:901 +msgid "height" +msgstr "výška" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" +"Pokud je výška nastavena na 0, velikost obrázku bude upravena podle zadané " +"šířky." + +#: models.py:904 +msgid "quality" +msgstr "kvalita" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "Kvalita JPEG." + +#: models.py:908 +msgid "upscale images?" +msgstr "zvětšit obrázky?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" +"Pokud je vybráno, obrázek bude podle potřeby zvětšen, aby odpovídal " +"požadovaným rozměrům. Pokud má být obrázek oříznutý, bude podle potřeby " +"zvětšen bez ohledu na toto nastavení." + +#: models.py:911 +msgid "crop to fit?" +msgstr "oříznout?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"Pokud je vybráno, obrázek bude oříznutý, aby odpovídal požadovaným proporcím." + +#: models.py:914 +msgid "pre-cache?" +msgstr "vytvářet předem?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" +"Pokud je vybráno, bude pro každý obrázek vytvořena varianta v této velikosti " +"předem, místo až v době zobrazení." + +#: models.py:917 +msgid "increment view count?" +msgstr "navyšovat počet zobrazení?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"Pokud je vybráno, bude hodnota „view_count“ obrázku navyšována s každým " +"zobrazením obrázku této velikosti." + +#: models.py:929 +msgid "watermark image" +msgstr "obrázek s vodotiskem" + +#: models.py:933 +msgid "photo size" +msgstr "velikost obrázku" + +#: models.py:934 +msgid "photo sizes" +msgstr "velikosti obrázků" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Ořezávat fotografie je možné, pouze pokud je zadána výška i šířka." + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "Nejnovější fotogalerie" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "Zveřejněné" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "Žádné fotogalerie nebyly nalezeny" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "Prohlédnout všechny fotogalerie" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "Všechny fotogalerie" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "předchozí" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" +"\n" +"strana %(page_number)s z %(total_pages)s" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "další" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "Tato fotografie se nachází v následujících fotogaleriích" diff --git a/photologue/locale/da/LC_MESSAGES/django.mo b/photologue/locale/da/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..3e177a64e23cfb5f334e382abde3ba891c30303c GIT binary patch literal 8401 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 literal 0 HcmV?d00001 diff --git a/photologue/locale/da/LC_MESSAGES/django.po b/photologue/locale/da/LC_MESSAGES/django.po new file mode 100644 index 00000000..8dd24dc8 --- /dev/null +++ b/photologue/locale/da/LC_MESSAGES/django.po @@ -0,0 +1,633 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Michael Lind Mortensen , 2009 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-25 09:56+0000\n" +"PO-Revision-Date: 2013-11-20 11:06+0000\n" +"Last-Translator: richardbarran \n" +"Language-Team: Danish (http://www.transifex.com/projects/p/django-photologue/" +"language/da/)\n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "Adskil tags med mellemrum, placer anførselstegn omkring flerordstags." + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "" +"Django-tagging blev ikke fundet, tags vil blive behandlet som normal tekst." + +#: models.py:115 +msgid "Very Low" +msgstr "Meget Lav" + +#: models.py:116 +msgid "Low" +msgstr "Lav" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Medium Lav" + +#: models.py:118 +msgid "Medium" +msgstr "Medium" + +#: models.py:119 +msgid "Medium-High" +msgstr "Medium Høj" + +#: models.py:120 +msgid "High" +msgstr "Høj" + +#: models.py:121 +msgid "Very High" +msgstr "Meget Høj" + +#: models.py:126 +msgid "Top" +msgstr "Top" + +#: models.py:127 +msgid "Right" +msgstr "Højre" + +#: models.py:128 +msgid "Bottom" +msgstr "Bund" + +#: models.py:129 +msgid "Left" +msgstr "Venstre" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Center (Standard)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Flip venstre til højre" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Flip top til bund" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Roter 90 grader mod uret" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "Roter 90 grader med uret" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "Roter 180 grader" + +#: models.py:142 +msgid "Tile" +msgstr "Tile" + +#: models.py:143 +msgid "Scale" +msgstr "Skala" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" +"Sæt adskillige filtre i kæde vha. følgende mønster \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Billedefiltre vil blive påført i den anførte rækkefølge. De " +"følgende filtre er tilgænglige: %s." + +#: models.py:159 +msgid "date published" +msgstr "dato offentliggjort" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "titel" + +#: models.py:164 +msgid "title slug" +msgstr "titel slug" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "En \"slug\" er en unik URL-venlig titel for et objekt" + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "beskrivelse" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "er offentlig" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Offentlige gallerier vil blive vist i standard views." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "billeder" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "tags" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "galleri" + +#: models.py:188 +msgid "galleries" +msgstr "gallerier" + +#: models.py:225 +msgid "count" +msgstr "tæller" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "billedefil (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "Vælg en .zip-fil af billeder til at uploade ind i det nye Galleri" + +#: models.py:252 +#, fuzzy +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" +"Alle billeder i galleriet vil blive givet en titel ud fra galleriets titel + " +"et sekventielt nummer." + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "billedetekst" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "Billedeteksten vil blive tilføjet til alle billeder." + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "En beskrivelse af dette Galleri" + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" +"Fjern afkrydsningen her for at gøre det uploadede galleri og alle " +"inkluderede billeder private." + +#: models.py:276 +msgid "gallery upload" +msgstr "galleri uploadet" + +#: models.py:277 +msgid "gallery uploads" +msgstr "galleri uploads" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "billede" + +#: models.py:395 +msgid "date taken" +msgstr "dato taget" + +#: models.py:399 +msgid "view count" +msgstr "" + +#: models.py:402 +msgid "crop from" +msgstr "beskær fra" + +#: models.py:411 +msgid "effect" +msgstr "effekt" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "En \"admin_thumbnail\" billedestørrelse er ikke blevet defineret." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Thumbnail" + +#: models.py:649 +msgid "slug" +msgstr "slug" + +#: models.py:654 +msgid "date added" +msgstr "dato tilføjet" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "Offentlige billeder vil blive vist i standard views." + +#: models.py:668 +msgid "photo" +msgstr "billede" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "navn" + +#: models.py:801 +msgid "rotate or flip" +msgstr "roter eller flip" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "farve" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" +"En faktor af 0.0 giver et sort og hvidt billede, en faktor af 1.0 giver det " +"originale billede." + +#: models.py:808 +msgid "brightness" +msgstr "lysstyrke" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" +"En faktor af 0.0 giver et sort billede, en faktor af 1.0 giver det originale " +"billede." + +#: models.py:811 +msgid "contrast" +msgstr "kontrast" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "" +"En faktor af 0.0 giver et solidt gråt billede, en faktor af 1.0 giver det " +"originale billede." + +#: models.py:814 +msgid "sharpness" +msgstr "skarphed" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" +"En faktor af 0.0 giver et sløret billede, en faktor af 1.0 giver det " +"originale billede." + +#: models.py:817 +msgid "filters" +msgstr "filtre" + +#: models.py:821 +msgid "size" +msgstr "størrelse" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"Højden af reflektionen som en procentdel af det originale billede. En faktor " +"af 0.0 tilføjer ingen reflektion, en faktor af 1.0 tilføjer en reflektion " +"lig med højden af det oprindelige billede." + +#: models.py:824 +msgid "strength" +msgstr "styrke" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "Den initielle uigennemsigtighed af den reflektive gradient." + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" +"Baggrundsfarven af den reflektive gradient. Sæt dette til at passe med " +"baggrundsfarven af din side." + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "billedeeffekt" + +#: models.py:834 +msgid "photo effects" +msgstr "billedeeffekter" + +#: models.py:865 +msgid "style" +msgstr "stil" + +#: models.py:869 +msgid "opacity" +msgstr "uigennemsigtighed" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "Uigennemsigtigheden af overlaget." + +#: models.py:874 +msgid "watermark" +msgstr "vandmærke" + +#: models.py:875 +msgid "watermarks" +msgstr "vandmærker" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"Billede størrelse navn må kun indeholde bogstaver, numre og underscores. " +"Eksempler: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." + +#: models.py:898 +msgid "width" +msgstr "bredde" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" +"Hvis bredden er sat til \"0\" vil billede blive skaleret til den givne højde." + +#: models.py:901 +msgid "height" +msgstr "højde" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" +"Hvis højden er sat til \"0\" vil billede blive skaleret til den givne bredde." + +#: models.py:904 +msgid "quality" +msgstr "kvalitet" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "JPEG billedekvalitet" + +#: models.py:908 +msgid "upscale images?" +msgstr "opskaler billeder?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" +"Hvis valgt, vil billedet blive skaleret op såfremt det er nødvendigt for at " +"passe til de givne dimensioner. Beskårede størrelser vil blive opskaleret " +"uanset denne indstilling." + +#: models.py:911 +msgid "crop to fit?" +msgstr "beskær til at passe?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"Hvis valgt, vil billedet blive skaleret og beskåret for at passe til de " +"givne dimensioner." + +#: models.py:914 +msgid "pre-cache?" +msgstr "pre-cache?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" +"Hvis valgt, vil dette billedes størrelse blive pre-cached som billeder " +"bliver tilføjet." + +#: models.py:917 +msgid "increment view count?" +msgstr "inkrementer set tæller?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"Hvis valgt, vil billedets \"view_count\" blive inkrementeret når billedets " +"størrelse vises." + +#: models.py:929 +msgid "watermark image" +msgstr "vandmærkebillede" + +#: models.py:933 +msgid "photo size" +msgstr "billedestørrelse" + +#: models.py:934 +msgid "photo sizes" +msgstr "billedestørrelser" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "" diff --git a/photologue/locale/de/LC_MESSAGES/django.mo b/photologue/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..7d54122460482d1b0b2b666cb46a6220e7f55381 GIT binary patch literal 9161 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 literal 0 HcmV?d00001 diff --git a/photologue/locale/de/LC_MESSAGES/django.po b/photologue/locale/de/LC_MESSAGES/django.po new file mode 100644 index 00000000..8186a537 --- /dev/null +++ b/photologue/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,646 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# FIRST AUTHOR , 2009 +# Jannis, 2012 +# Jannis Š, 2012-2013 +# Jannis Š, 2012 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-25 09:56+0000\n" +"PO-Revision-Date: 2013-11-20 11:06+0000\n" +"Last-Translator: richardbarran \n" +"Language-Team: German (http://www.transifex.com/projects/p/django-photologue/" +"language/de/)\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "" +"Trenne Schlagwörter mit Leerzeichen, gruppiere mehrteilige Begriffe mit " +"Anführungzeichen." + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "" +"Django-tagging wurde nicht gefunden, Schlagwörter werden als einfacher Text " +"behandelt." + +#: models.py:115 +msgid "Very Low" +msgstr "Sehr niedrig" + +#: models.py:116 +msgid "Low" +msgstr "Niedrig" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Mittel-niedrig" + +#: models.py:118 +msgid "Medium" +msgstr "Mittel" + +#: models.py:119 +msgid "Medium-High" +msgstr "Mittel-hoch" + +#: models.py:120 +msgid "High" +msgstr "Hoch" + +#: models.py:121 +msgid "Very High" +msgstr "Sehr hoch" + +#: models.py:126 +msgid "Top" +msgstr "Oben" + +#: models.py:127 +msgid "Right" +msgstr "Rechts" + +#: models.py:128 +msgid "Bottom" +msgstr "Unten" + +#: models.py:129 +msgid "Left" +msgstr "Links" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Mitte (Standard)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Horizontal spiegeln" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Vertikal spiegeln" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Um 90° nach links drehen" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "Um 90° nach rechts drehen" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "Um 180° drehen" + +#: models.py:142 +msgid "Tile" +msgstr "Kacheln" + +#: models.py:143 +msgid "Scale" +msgstr "Skalieren" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" +"Verkette mehrere Filter in der Art \"FILTER_EINS->FILTER_ZWEI->FILTER_DREI" +"\". Bildfilter werden nach der Reihe angewendet. Folgende Filter sind " +"verfügbar: %s." + +#: models.py:159 +msgid "date published" +msgstr "Veröffentlichungsdatum" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "Titel" + +#: models.py:164 +msgid "title slug" +msgstr "Kurztitel" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "" +"Ein Kurztitel (\"slug\") ist ein eindeutiger, URL-geeigneter Titel für ein " +"Objekt." + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "Beschreibung" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "ist öffentlich" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Öffentliche Galerien werden in den Standard-Views angezeigt." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "Fotos" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "Schlagwörter" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "Galerie" + +#: models.py:188 +msgid "galleries" +msgstr "Galerien" + +#: models.py:225 +msgid "count" +msgstr "Anzahl" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "Bilder-Archiv (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "" +"Wähle eine .zip-Datei mit Bildern aus, um sie in eine neue Galerie " +"hochzuladen." + +#: models.py:252 +#, fuzzy +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" +"Alle Fotos in der Galerie bekommen einen Namen, der aus dem Namen der " +"Galerie und einer fortlaufenden Nummer zusammengesetzt ist." + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "Bildunterschrift" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "Die Bildunterschrift wird allen Fotos hinzugefügt." + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "Beschreibung dieser Galerie." + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" +"Schalte dies aus, um die hochgeladene Galerie und alle enthaltenen Bilder " +"privat zu machen." + +#: models.py:276 +msgid "gallery upload" +msgstr "Galerie-Upload" + +#: models.py:277 +msgid "gallery uploads" +msgstr "Galerie-Uploads" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "Bild" + +#: models.py:395 +msgid "date taken" +msgstr "Aufnahmedatum" + +#: models.py:399 +msgid "view count" +msgstr "Anzahl an Aufrufen" + +#: models.py:402 +msgid "crop from" +msgstr "Beschneiden von" + +#: models.py:411 +msgid "effect" +msgstr "Effekt" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Es ist keine Fotogröße \"admin_thumbnail\" definiert." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Vorschaubild" + +#: models.py:649 +msgid "slug" +msgstr "Kurztitel" + +#: models.py:654 +msgid "date added" +msgstr "Datum des Eintrags" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "Öffentliche Fotos werden in den Standard-Views angezeigt." + +#: models.py:668 +msgid "photo" +msgstr "Foto" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "Name" + +#: models.py:801 +msgid "rotate or flip" +msgstr "drehen oder spiegeln" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "Farbe" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" +"Ein Faktor von 0.0 erzeugt ein Schwarzweißbild, ein Faktor von 1.0 erhält " +"das Originalbild." + +#: models.py:808 +msgid "brightness" +msgstr "Helligkeit" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Ein Faktor von 0.0 erzeugt ein schwarzes Bild, ein Faktor von 1.0 erhält das " +"Originalbild." + +#: models.py:811 +msgid "contrast" +msgstr "Kontrast" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Ein Faktor von 0.0 erzeugt ein opak graues Bild, ein Faktor von 1.0 erhält " +"das Originalbild." + +#: models.py:814 +msgid "sharpness" +msgstr "Schärfe" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Ein Faktor von 0.0 erzeugt ein sehr unscharfes Bild, ein Faktor von 1.0 " +"erhält das Originalbild." + +#: models.py:817 +msgid "filters" +msgstr "Filter" + +#: models.py:821 +msgid "size" +msgstr "Größe" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"Die Höhe der Reflexion als Prozentwert des Originalbildes. Ein Faktor von " +"0.0 erzeugt keine Reflexion, ein Faktor von 1.0 ergibt eine Reflexion von " +"der Höhe des Originalbildes." + +#: models.py:824 +msgid "strength" +msgstr "Stärke" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "Die Anfangs-Deckung des Reflexions-Verlaufs." + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" +"Die Hintergrundfarbe des Reflexions-Verlaufs. Setze dies auf die " +"Hintergrundfarbe deiner Seite." + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "Foto-Effekt" + +#: models.py:834 +msgid "photo effects" +msgstr "Foto-Effekte" + +#: models.py:865 +msgid "style" +msgstr "Stil" + +#: models.py:869 +msgid "opacity" +msgstr "Deckung" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "Deckung (Opazität) der Überlagerung" + +#: models.py:874 +msgid "watermark" +msgstr "Wasserzeichen" + +#: models.py:875 +msgid "watermarks" +msgstr "Wasserzeichen" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"Der Name der Fotogröße darf nur Buchstaben, Zahlen und Unterstriche " +"enthalten. Beispiele: \"thumbnail\", \"display\", \"small\", " +"\"main_page_widget\"." + +#: models.py:898 +msgid "width" +msgstr "Breite" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" +"Wenn die Breite auf \"0\" gesetzt ist, wird das Bild proportional auf die " +"angebene Höhe skaliert." + +#: models.py:901 +msgid "height" +msgstr "Höhe" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" +"Wenn die Höhe auf \"0\" gesetzt ist, wird das Bild proportional auf die " +"angebene Breite skaliert." + +#: models.py:904 +msgid "quality" +msgstr "Qualität" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "JPEG-Bildqualität" + +#: models.py:908 +msgid "upscale images?" +msgstr "Bilder hochskalieren?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" +"Soll das Bild hochskaliert werden, um das angegebene Format zu erreichen? " +"Beschnittene Größen werden unabhängig von dieser Einstellung bei Bedarf " +"hochskaliert." + +#: models.py:911 +msgid "crop to fit?" +msgstr "Zuschneiden?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"Soll das Bild auf das angegebene Format skaliert und beschnitten werden?" + +#: models.py:914 +msgid "pre-cache?" +msgstr "Vorausspeichern?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" +"Soll diese Bildgröße im Voraus gespeichert (pre-cached) werden, wenn Fotos " +"hinzugefügt werden?" + +#: models.py:917 +msgid "increment view count?" +msgstr "Bildzähler?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"Soll der Ansichts-Zähler (view-count) hochgezählt werden, wenn ein Foto " +"dieser Größe angezeigt wird?" + +#: models.py:929 +msgid "watermark image" +msgstr "Wasserzeichen-Bild" + +#: models.py:933 +msgid "photo size" +msgstr "Foto-Größe" + +#: models.py:934 +msgid "photo sizes" +msgstr "Foto-Größen" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" +"Fotos können nur zugeschnitten werden, wenn Breite und Höhe angegeben sind." + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "Neueste Fotogalerien" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "Veröffentlicht" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "Es wurden keine Galerien gefunden." + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "Zeige alle Galerien." + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "Alle Galerien" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "Vorherige" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "Nächste" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "Dieses Foto befindet sich in folgenden Galerien" diff --git a/photologue/locale/en/LC_MESSAGES/django.mo b/photologue/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..6ff763d6569c48a32b0d7c9b4025513ed6cd55d7 GIT binary patch literal 416 zcmYL^(N4lJ6oxf=wM(zPsEHREJh%}>C}Nmw;F66kW0>e&g)(MFyR@Cr2l4fM7SGhk zpL}VXemVX7b#(Z-huKGtkyGRVxj>rqkTqWRac!LcBuc*WrGa1tk6h_O3QCfVG_sU= z&8?JIQW=PJUaa80&NXC`5-W)_7%R>U`rt9cDe2hG71%e>=@Pq7ue&YVv27F~@7fRlakuY7|8N?rTolw#HHzF7UaJ3VR#=ZZ4~m6=Fb^ z8>Tcj!$mfM-p*@kt+@hUEaj>YIVHW9!dOXJD^|ips;#C(R6j>O>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-25 09:56+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "" + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "" + +#: models.py:115 +msgid "Very Low" +msgstr "" + +#: models.py:116 +msgid "Low" +msgstr "" + +#: models.py:117 +msgid "Medium-Low" +msgstr "" + +#: models.py:118 +msgid "Medium" +msgstr "" + +#: models.py:119 +msgid "Medium-High" +msgstr "" + +#: models.py:120 +msgid "High" +msgstr "" + +#: models.py:121 +msgid "Very High" +msgstr "" + +#: models.py:126 +msgid "Top" +msgstr "" + +#: models.py:127 +msgid "Right" +msgstr "" + +#: models.py:128 +msgid "Bottom" +msgstr "" + +#: models.py:129 +msgid "Left" +msgstr "" + +#: models.py:130 +msgid "Center (Default)" +msgstr "" + +#: models.py:134 +msgid "Flip left to right" +msgstr "" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "" + +#: models.py:142 +msgid "Tile" +msgstr "" + +#: models.py:143 +msgid "Scale" +msgstr "" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" + +#: models.py:159 +msgid "date published" +msgstr "" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "" + +#: models.py:164 +msgid "title slug" +msgstr "" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "" + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "" + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "" + +#: models.py:188 +msgid "galleries" +msgstr "" + +#: models.py:225 +msgid "count" +msgstr "" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "" + +#: models.py:252 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "" + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "" + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" + +#: models.py:276 +msgid "gallery upload" +msgstr "" + +#: models.py:277 +msgid "gallery uploads" +msgstr "" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "" + +#: models.py:395 +msgid "date taken" +msgstr "" + +#: models.py:399 +msgid "view count" +msgstr "" + +#: models.py:402 +msgid "crop from" +msgstr "" + +#: models.py:411 +msgid "effect" +msgstr "" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "" + +#: models.py:437 +msgid "Thumbnail" +msgstr "" + +#: models.py:649 +msgid "slug" +msgstr "" + +#: models.py:654 +msgid "date added" +msgstr "" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "" + +#: models.py:668 +msgid "photo" +msgstr "" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "" + +#: models.py:801 +msgid "rotate or flip" +msgstr "" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" + +#: models.py:808 +msgid "brightness" +msgstr "" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" + +#: models.py:811 +msgid "contrast" +msgstr "" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "" + +#: models.py:814 +msgid "sharpness" +msgstr "" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" + +#: models.py:817 +msgid "filters" +msgstr "" + +#: models.py:821 +msgid "size" +msgstr "" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" + +#: models.py:824 +msgid "strength" +msgstr "" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "" + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "" + +#: models.py:834 +msgid "photo effects" +msgstr "" + +#: models.py:865 +msgid "style" +msgstr "" + +#: models.py:869 +msgid "opacity" +msgstr "" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "" + +#: models.py:874 +msgid "watermark" +msgstr "" + +#: models.py:875 +msgid "watermarks" +msgstr "" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" + +#: models.py:898 +msgid "width" +msgstr "" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" + +#: models.py:901 +msgid "height" +msgstr "" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" + +#: models.py:904 +msgid "quality" +msgstr "" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "" + +#: models.py:908 +msgid "upscale images?" +msgstr "" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" + +#: models.py:911 +msgid "crop to fit?" +msgstr "" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" + +#: models.py:914 +msgid "pre-cache?" +msgstr "" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" + +#: models.py:917 +msgid "increment view count?" +msgstr "" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" + +#: models.py:929 +msgid "watermark image" +msgstr "" + +#: models.py:933 +msgid "photo size" +msgstr "" + +#: models.py:934 +msgid "photo sizes" +msgstr "" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "" diff --git a/photologue/locale/en_US/LC_MESSAGES/django.mo b/photologue/locale/en_US/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..a9fc36f438f6a1c30aac21c106598a1eb7beb163 GIT binary patch literal 9169 zcmeI0U5q4E6@V|wkBoqT2#Bm++C^sEt)7{MU3Po_nVng7ot+)#XBR{ns=IG@*GzR) zZB_L)LzEbU8YIFCU?P$jqdrI=D?Z`_{zM}tJYZrF69uCWqQPK@7^A`O+`7{}yDUlw zPi88){nhcMKxEZd8U3ekE|h*J z;3E7p+yjqXq?CbQg-^hL!(n&=VIt=RScdO(^qg!wojnC*e$PPJ z$6rH{|3_E;7byK-gEEiTp~%00!9@P$j_aW4p#)`|4X%9D<+nf?X9tvZ?05O2P~=rz zdFaYN14Yi4;Lpxb>ML+F`FV^={OMjO{`4a#{`4Z8f|bh)`@RRxl7Ak`I?Ep{`tN|U zz7&eTEW`EiNr)+_7vQ7t6<7br6@`9(=lC}$>plyknt%gv8r}r&hu?&^!c7DP@u&OX ze)ue8>(v$O3V$j?kuwg({tiN!*A$d}n1`Y-A4j&n-Z7A&;yD zQ@6hKX*fZulEmg~q}xd=&kA6|K^_|2h*RxHI<797T3)7G-DI^iNb(@2 zw4w7B0`~i1Xwqe=ZuqsFF4T;aM|3kdZbW`H^lMAVsq1bl$c+x#%w;1L{pO>+=6TEL zI1QRXJlvE|)>Syhep>vix6G%fndI&Oh>(?m>WLOfGiP<`62va_=9 zNg<{YFxqNS{p~KlHG!Q(Y$q}`lVyHNq=?yvHy5hM+~8uTeI<4hx3ttW{j?q;tQSzw zNX{m_$$YNKbm@3tx(hY-CNK3=6-2evV7j7>ZVNZC!D*F`pzC^&v1QBR8z(D|x>YS# zb~;IoSMzHvB+6!syA@7h?cd5M+~;j>W8raSb#QuozuUcI9X||mg6SkSmgRcd`gjpy zB@j$vU}`e%szat8blMJ{HLIe?liDdvQccCWX=5`Tb=P3@)|^!#)5eX+Z(~-ixD#R} zag>WW+fWg*2RQ3SU7RH>8#}@mD67S($;x{C4!@0CXBA!Q$E1zA8J_1nyf=c-xjpB#1N zJBbd&9}c%hvDKM)PA3UtUji2IK2Fu`pQgR8#U5Hm!|p^Ane%lKQPz{jKW++ZH|-?1 z4RHloP$66n9A3yT?hgaZq0;Caob~&IZ>)t`hy5gg*6(f~wmu?N4bJA2%s6OP1e@QoLAKUh$0nLE3Y8n!AgF zn#1hWT%4%+h*-u|tgrbcF&yK}kTADmD&p+~)UYGx{Av$N(%?9jQdUQ}@@X4(?3)Cg zBlxAg5%ecfwFhBDbXT?F4xy}Z@Ehf+pXI#ZIm+Hl#6F8RRLhyNTh*-*%Vnc@O(a%W zzqK{Fzhok{>Q1Umqk*j{chIZ;MBKt$$+BDVDcMXFo2l$cTKuAE@!COg;33sJWNZ*3 zWHR~PO7_J@F(vU-xeZiSZ^f^66SGAwlesDh#H(IiF<3c$b}M%(sI-VvI9G$)hRRxg znpovp8FHmp8P}7jnYVaZX4}Q1m38ytSKCJJ^mTz~w~~ljEJk%vdD`~VrT$ydte?+R zasQZ3WBD%d4%9ttK(36H;=BsuX2%T7m?Tbf?@-nZ>fQ~VX6DVs6+JM0c+MM>@I-rW zAEQypij@Ow%L$5+o8_>*WNz28CT>PM=jSH8t^IZ~ zn+7M(cvOq)+?pzSYc\n" +"Language-Team: English (United States) (http://www.transifex.com/projects/p/" +"django-photologue/language/en_US/)\n" +"Language: en_US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "Separate tags with spaces, put quotes around multiple-word tags." + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "Django-tagging was not found, tags will be treated as plain text." + +#: models.py:115 +msgid "Very Low" +msgstr "Very Low" + +#: models.py:116 +msgid "Low" +msgstr "Low" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Medium-Low" + +#: models.py:118 +msgid "Medium" +msgstr "Medium" + +#: models.py:119 +msgid "Medium-High" +msgstr "Medium-High" + +#: models.py:120 +msgid "High" +msgstr "High" + +#: models.py:121 +msgid "Very High" +msgstr "Very High" + +#: models.py:126 +msgid "Top" +msgstr "Top" + +#: models.py:127 +msgid "Right" +msgstr "Right" + +#: models.py:128 +msgid "Bottom" +msgstr "Bottom" + +#: models.py:129 +msgid "Left" +msgstr "Left" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Center (Default)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Flip left to right" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Flip top to bottom" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Rotate 90 degrees counter-clockwise" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "Rotate 90 degrees clockwise" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "Rotate 180 degrees" + +#: models.py:142 +msgid "Tile" +msgstr "Tile" + +#: models.py:143 +msgid "Scale" +msgstr "Scale" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." + +#: models.py:159 +msgid "date published" +msgstr "date published" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "title" + +#: models.py:164 +msgid "title slug" +msgstr "title slug" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "A \"slug\" is a unique URL-friendly title for an object." + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "description" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "is public" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Public galleries will be displayed in the default views." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "photos" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "tags" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "gallery" + +#: models.py:188 +msgid "galleries" +msgstr "galleries" + +#: models.py:225 +msgid "count" +msgstr "count" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "images file (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "Select a .zip file of images to upload into a new Gallery." + +#: models.py:252 +#, fuzzy +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" +"All photos in the gallery will be given a title made up of the gallery title " +"+ a sequential number." + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "caption" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "Caption will be added to all photos." + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "A description of this Gallery." + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" +"Uncheck this to make the uploaded gallery and included photographs private." + +#: models.py:276 +msgid "gallery upload" +msgstr "gallery upload" + +#: models.py:277 +msgid "gallery uploads" +msgstr "gallery uploads" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "image" + +#: models.py:395 +msgid "date taken" +msgstr "date taken" + +#: models.py:399 +msgid "view count" +msgstr "view count" + +#: models.py:402 +msgid "crop from" +msgstr "crop from" + +#: models.py:411 +msgid "effect" +msgstr "effect" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "An \"admin_thumbnail\" photo size has not been defined." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Thumbnail" + +#: models.py:649 +msgid "slug" +msgstr "slug" + +#: models.py:654 +msgid "date added" +msgstr "date added" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "Public photographs will be displayed in the default views." + +#: models.py:668 +msgid "photo" +msgstr "photo" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "name" + +#: models.py:801 +msgid "rotate or flip" +msgstr "rotate or flip" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "color" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." + +#: models.py:808 +msgid "brightness" +msgstr "brightness" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." + +#: models.py:811 +msgid "contrast" +msgstr "contrast" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." + +#: models.py:814 +msgid "sharpness" +msgstr "sharpness" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." + +#: models.py:817 +msgid "filters" +msgstr "filters" + +#: models.py:821 +msgid "size" +msgstr "size" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." + +#: models.py:824 +msgid "strength" +msgstr "strength" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "The initial opacity of the reflection gradient." + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "photo effect" + +#: models.py:834 +msgid "photo effects" +msgstr "photo effects" + +#: models.py:865 +msgid "style" +msgstr "style" + +#: models.py:869 +msgid "opacity" +msgstr "opacity" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "The opacity of the overlay." + +#: models.py:874 +msgid "watermark" +msgstr "watermark" + +#: models.py:875 +msgid "watermarks" +msgstr "watermarks" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." + +#: models.py:898 +msgid "width" +msgstr "width" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" +"If width is set to \"0\" the image will be scaled to the supplied height." + +#: models.py:901 +msgid "height" +msgstr "height" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" +"If height is set to \"0\" the image will be scaled to the supplied width" + +#: models.py:904 +msgid "quality" +msgstr "quality" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "JPEG image quality." + +#: models.py:908 +msgid "upscale images?" +msgstr "upscale images?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." + +#: models.py:911 +msgid "crop to fit?" +msgstr "crop to fit?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." + +#: models.py:914 +msgid "pre-cache?" +msgstr "pre-cache?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "If selected this photo size will be pre-cached as photos are added." + +#: models.py:917 +msgid "increment view count?" +msgstr "increment view count?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." + +#: models.py:929 +msgid "watermark image" +msgstr "watermark image" + +#: models.py:933 +msgid "photo size" +msgstr "photo size" + +#: models.py:934 +msgid "photo sizes" +msgstr "photo sizes" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Can only crop photos if both width and height dimensions are set." + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "Latest Photo Galleries" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "Published" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "No galleries were found" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "View all galleries" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "All Galleries" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "Previous" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "Next" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "This photo is found in the following galleries" diff --git a/photologue/locale/es_ES/LC_MESSAGES/django.mo b/photologue/locale/es_ES/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..13ebd75d4ad507e46a975710a6fe77ea822b3fa3 GIT binary patch literal 13580 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 literal 0 HcmV?d00001 diff --git a/photologue/locale/es_ES/LC_MESSAGES/django.po b/photologue/locale/es_ES/LC_MESSAGES/django.po new file mode 100644 index 00000000..870f94a6 --- /dev/null +++ b/photologue/locale/es_ES/LC_MESSAGES/django.po @@ -0,0 +1,599 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Translators: +# dmalisani , 2014 +# dmalisani , 2014 +# Rafa Muñoz Cárdenas , 2009 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-25 09:56+0000\n" +"PO-Revision-Date: 2014-08-25 13:27+0000\n" +"Last-Translator: dmalisani \n" +"Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/django-photologue/language/es_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "La siguiente foto no pertenece al mismo sitio(s)" +msgstr[1] "Las siguientes fotos no pertenecen al(los) mismo(s) sitio(s)" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "La galería ha sido agregada exitosamente a %(site)s" +msgstr[1] "Las galerías han sido agregadas exitosamente a %(site)s" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "Agregar las imágenes seleccionadas desde el sitio actual" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "La galería ha sido eliminada correctamente de %(site)s" +msgstr[1] "Las galerías seleccionadas han sido eliminadas correctamente de %(site)s" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "Eliminar las galerías seleccionadas del sitio actual" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "Todas las fotos en la galería %(galleries)s han sido correctamente agregadas a %(site)s" +msgstr[1] "Todas las fotos en las galerías %(galleries)s han sido correctamente agregadas a %(site)s" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "Agregar todas las fotos de las galerías seleccionadas al sitio actual" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "Todas las fotos en la galería %(galleries)s han sido correctamente eliminadas de %(site)s" +msgstr[1] "Todas las fotos en las galerías %(galleries)s han sido correctamente eliminadas de %(site)s" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "Eliminar todas las fotos seleccionadas en las galerías del sito actual" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "La foto a sido agregada correctamente a %(site)s" +msgstr[1] "Las fotos seleccionadas han sido agregadas correctamente a %(site)s" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "Agregar las fotos seleccionadas al sitio actual" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "" +"The selected photos have been successfully removed from %(site)s" +msgstr[0] "La foto ha sido eliminada correctamente de %(site)s" +msgstr[1] "Las fotos han sido correctamente eliminadas de %(site)s" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "Eliminar la foto seleccionada del sitio actual" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "Separe los tags con espacios y ponga comillas para los tags con múltiples palabras." + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "No se encontró Django-tagging, por lo que los tags se tratarán como texto plano." + +#: models.py:115 +msgid "Very Low" +msgstr "Muy bajo" + +#: models.py:116 +msgid "Low" +msgstr "Bajo" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Medio-bajo" + +#: models.py:118 +msgid "Medium" +msgstr "Medio" + +#: models.py:119 +msgid "Medium-High" +msgstr "Medio-alto" + +#: models.py:120 +msgid "High" +msgstr "Alto" + +#: models.py:121 +msgid "Very High" +msgstr "Muy alto" + +#: models.py:126 +msgid "Top" +msgstr "Arriba" + +#: models.py:127 +msgid "Right" +msgstr "Derecha" + +#: models.py:128 +msgid "Bottom" +msgstr "Abajo" + +#: models.py:129 +msgid "Left" +msgstr "Izquierda" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Centro (por defecto)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Voltear de izquerda a derecha" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Voltear de arriba a abajo" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Rotar 90 grados en sentido horario" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "Rotar 90 grados en sentido antihorario" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "Rotar 180 grados" + +#: models.py:142 +msgid "Tile" +msgstr "Mosaico" + +#: models.py:143 +msgid "Scale" +msgstr "Escalar" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern " +"\"FILTER_ONE->FILTER_TWO->FILTER_THREE\". Image filters will be applied in " +"order. The following filters are available: %s." +msgstr "Encadene múltiples filtros usando el siguiente patrón \"FILTRO_UNO->FILTRO_DOS->FILTRO_TRES\". Los filtros de imagen se aplicarán en orden. Los siguientes filtros están disponibles: %s." + +#: models.py:159 +msgid "date published" +msgstr "fecha de publicación" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "título" + +#: models.py:164 +msgid "title slug" +msgstr "título slug" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "Un \"slug\" es un único título URL-amigable para un objeto." + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "descripción" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "es público" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Las galerías públicas serán mostradas en las vistas por defecto." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "fotos" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "tags" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "sitios" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "galería" + +#: models.py:188 +msgid "galleries" +msgstr "galerías" + +#: models.py:225 +msgid "count" +msgstr "contar" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "archivo de imágenes (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "Seleccione un archivo .zip de imágenes para subir a la nueva galería." + +#: models.py:252 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "A todas las fotos subidas se les cambiará el título por este título + un número secuencial" + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "Seleccione una galería para agregarle estas imágenes. Déjelo vacío para crear una nueva galería a partir de este título." + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "pie de foto" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "El pie de foto se añadirá a todas las fotos." + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "Una descripción para esta galería." + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Desactive esto para hacer que la galería subida y fotos incluidas sean privadas." + +#: models.py:276 +msgid "gallery upload" +msgstr "subida de galería" + +#: models.py:277 +msgid "gallery uploads" +msgstr "subida de galerías" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "Ya existe una galería con ese título." + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "Seleccione una galería existente o ingrese un nuevo nombre para la galería." + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "Ignorando archivos \"{filename}\" por estar en subcarpetas, todas las imágenes deben estar en la carpeta de primer nivel del zip." + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that" +" slug already exists." +msgstr "No se creó \"%(filename)s\" con slug \"{1}\" porque una foto con ese slug ya existe." + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "No se pudo procesar el archivo \"{0}\" en el archivo zip." + +#: models.py:392 models.py:863 +msgid "image" +msgstr "imagen" + +#: models.py:395 +msgid "date taken" +msgstr "fecha en la que se tomó" + +#: models.py:399 +msgid "view count" +msgstr "Contador de visitas" + +#: models.py:402 +msgid "crop from" +msgstr "Recortar desde" + +#: models.py:411 +msgid "effect" +msgstr "efecto" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "El tamaño de foto de \"miniatura de admin\" no ha sido definido." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Miniatura" + +#: models.py:649 +msgid "slug" +msgstr "slug" + +#: models.py:654 +msgid "date added" +msgstr "fecha añadida" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "Las fotos públicas serán mostradas en las vistas por defecto." + +#: models.py:668 +msgid "photo" +msgstr "foto" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "nombre" + +#: models.py:801 +msgid "rotate or flip" +msgstr "rotar o voltear" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "color" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "Un factor de 0.0 proporciona una imagen blanca y negra. Un factor de 1.0 proporciona la imagen original." + +#: models.py:808 +msgid "brightness" +msgstr "iluminación" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "Un factor de 0.0 proporciona una imagen negra. Un factor de 1.0 proporciona la imagen original." + +#: models.py:811 +msgid "contrast" +msgstr "contraste" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original" +" image." +msgstr "Un factor de 0.0 proporciona una imagen sólida gris. Un factor de 1.0 proporciona la imagen original." + +#: models.py:814 +msgid "sharpness" +msgstr "Resaltado" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "Un factor de 0.0 proporciona una imagen desenfocada, un factor de 1.0 proporciona la imagen original." + +#: models.py:817 +msgid "filters" +msgstr "filtros" + +#: models.py:821 +msgid "size" +msgstr "tamaño" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "La altura de la reflexión como porcentaje de la imagen original. Un factor de 0.0 no da ninguna reflexión, un factor de 1.0 añade una reflexión igual a la altura de la imagen original." + +#: models.py:824 +msgid "strength" +msgstr "fortaleza" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "La opacidad inicial del gradiente de reflexión." + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "El color de fondo del gradiente de reflexión. Establezca esto para hacer coincidir el color de fondo con el color de tu página." + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "efecto de foto" + +#: models.py:834 +msgid "photo effects" +msgstr "efectos de foto" + +#: models.py:865 +msgid "style" +msgstr "estilo" + +#: models.py:869 +msgid "opacity" +msgstr "opacidad" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "La opacidad de la superposición" + +#: models.py:874 +msgid "watermark" +msgstr "marca de agua" + +#: models.py:875 +msgid "watermarks" +msgstr "marcas de agua" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "El nombre del tamaño solo puede contener letras, números y subrayados. Por ejemplo:\"miniaturas\", \"muestra\", \"muestra_principal\"." + +#: models.py:898 +msgid "width" +msgstr "anchura" + +#: models.py:900 +msgid "If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Si la anchura se establece a \"0\" la imagen será escalada hasta la altura proporcionada" + +#: models.py:901 +msgid "height" +msgstr "altura" + +#: models.py:903 +msgid "If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Si la altura se establece a \"0\" la imagen será escalada hasta la anchura proporcionada" + +#: models.py:904 +msgid "quality" +msgstr "calidad" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "Calidad de imagen JPEG." + +#: models.py:908 +msgid "upscale images?" +msgstr "¿Aumentar imágenes?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Si se selecciona la imagen será aumentada si es necesario para ajustarse a las dimensiones proporcionadas. Los tamaños recortados serán aumentados de acuerdo a esta opción." + +#: models.py:911 +msgid "crop to fit?" +msgstr "¿Recortar hasta ajustar?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "Si se selecciona la imagen será escalada y recortada para ajustarse a las dimensiones proporcionadas." + +#: models.py:914 +msgid "pre-cache?" +msgstr "¿pre-cachear?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Si se selecciona, este tamaño de foto será pre-cacheado cuando se añadan nuevas fotos." + +#: models.py:917 +msgid "increment view count?" +msgstr "¿incrementar contador de visualizaciones?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "Si se selecciona el \"contador de visualizaciones\" se incrementará cuando esta foto sea visualizada." + +#: models.py:929 +msgid "watermark image" +msgstr "marca de agua" + +#: models.py:933 +msgid "photo size" +msgstr "tamaño de foto" + +#: models.py:934 +msgid "photo sizes" +msgstr "tamaños de foto" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Solo puede recortar las fotos si ancho y alto están establecidos." + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "Últimas galerías de fotos." + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "Publicado" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "No se encontraron galerías" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "Ver todas las galerías" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "Todas las Galerías" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "Anterior" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "\n⇥⇥⇥⇥ página %(page_number)s de %(total_pages)s\n⇥⇥⇥⇥" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "Próximo" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "Esta foto se encontró en las siguientes galerías" diff --git a/photologue/locale/eu/LC_MESSAGES/django.mo b/photologue/locale/eu/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..68047603338360520bd61aa5faa99b57b19feb61 GIT binary patch literal 490 zcmYLFO-}+b5XI+r=*^VhoCji9}*n?}Z(g;?k~dSMZ1UKm0}h7H5UP zOJ3S(-+P&v-`$<>24Rc1M?4^I6HkaWTErjvY|~k5))+cF#c_a#3|`TBZH;8Zi4C@} zd4)ga+8&~hw zxFE}nm&=hoFL^d4uZ40wFfUeN94mgb zj+P9oXz(!TZlcMc`$jwCS+Ad5@v{lHNmWqpSOPLkE2`wwX4$ mWUY}7(XgnTD&XF_nU~Cz|E2FXJ8XIF9vZgaWyw(|YWx8rxRSE~ literal 0 HcmV?d00001 diff --git a/photologue/locale/eu/LC_MESSAGES/django.po b/photologue/locale/eu/LC_MESSAGES/django.po new file mode 100644 index 00000000..75404428 --- /dev/null +++ b/photologue/locale/eu/LC_MESSAGES/django.po @@ -0,0 +1,597 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-25 09:56+0000\n" +"PO-Revision-Date: 2013-11-20 11:06+0000\n" +"Last-Translator: richardbarran \n" +"Language-Team: Basque (http://www.transifex.com/projects/p/django-photologue/" +"language/eu/)\n" +"Language: eu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "" + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "" + +#: models.py:115 +msgid "Very Low" +msgstr "" + +#: models.py:116 +msgid "Low" +msgstr "" + +#: models.py:117 +msgid "Medium-Low" +msgstr "" + +#: models.py:118 +msgid "Medium" +msgstr "" + +#: models.py:119 +msgid "Medium-High" +msgstr "" + +#: models.py:120 +msgid "High" +msgstr "" + +#: models.py:121 +msgid "Very High" +msgstr "" + +#: models.py:126 +msgid "Top" +msgstr "" + +#: models.py:127 +msgid "Right" +msgstr "" + +#: models.py:128 +msgid "Bottom" +msgstr "" + +#: models.py:129 +msgid "Left" +msgstr "" + +#: models.py:130 +msgid "Center (Default)" +msgstr "" + +#: models.py:134 +msgid "Flip left to right" +msgstr "" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "" + +#: models.py:142 +msgid "Tile" +msgstr "" + +#: models.py:143 +msgid "Scale" +msgstr "" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" + +#: models.py:159 +msgid "date published" +msgstr "" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "" + +#: models.py:164 +msgid "title slug" +msgstr "" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "" + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "" + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "" + +#: models.py:188 +msgid "galleries" +msgstr "" + +#: models.py:225 +msgid "count" +msgstr "" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "" + +#: models.py:252 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "" + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "" + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" + +#: models.py:276 +msgid "gallery upload" +msgstr "" + +#: models.py:277 +msgid "gallery uploads" +msgstr "" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "" + +#: models.py:395 +msgid "date taken" +msgstr "" + +#: models.py:399 +msgid "view count" +msgstr "" + +#: models.py:402 +msgid "crop from" +msgstr "" + +#: models.py:411 +msgid "effect" +msgstr "" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "" + +#: models.py:437 +msgid "Thumbnail" +msgstr "" + +#: models.py:649 +msgid "slug" +msgstr "" + +#: models.py:654 +msgid "date added" +msgstr "" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "" + +#: models.py:668 +msgid "photo" +msgstr "" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "" + +#: models.py:801 +msgid "rotate or flip" +msgstr "" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" + +#: models.py:808 +msgid "brightness" +msgstr "" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" + +#: models.py:811 +msgid "contrast" +msgstr "" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "" + +#: models.py:814 +msgid "sharpness" +msgstr "" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" + +#: models.py:817 +msgid "filters" +msgstr "" + +#: models.py:821 +msgid "size" +msgstr "" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" + +#: models.py:824 +msgid "strength" +msgstr "" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "" + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "" + +#: models.py:834 +msgid "photo effects" +msgstr "" + +#: models.py:865 +msgid "style" +msgstr "" + +#: models.py:869 +msgid "opacity" +msgstr "" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "" + +#: models.py:874 +msgid "watermark" +msgstr "" + +#: models.py:875 +msgid "watermarks" +msgstr "" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" + +#: models.py:898 +msgid "width" +msgstr "" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" + +#: models.py:901 +msgid "height" +msgstr "" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" + +#: models.py:904 +msgid "quality" +msgstr "" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "" + +#: models.py:908 +msgid "upscale images?" +msgstr "" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" + +#: models.py:911 +msgid "crop to fit?" +msgstr "" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" + +#: models.py:914 +msgid "pre-cache?" +msgstr "" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" + +#: models.py:917 +msgid "increment view count?" +msgstr "" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" + +#: models.py:929 +msgid "watermark image" +msgstr "" + +#: models.py:933 +msgid "photo size" +msgstr "" + +#: models.py:934 +msgid "photo sizes" +msgstr "" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "" diff --git a/photologue/locale/fr/LC_MESSAGES/django.mo b/photologue/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..712e0d778cde7370db0c319b0dd10a66a57f5942 GIT binary patch literal 8183 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 literal 0 HcmV?d00001 diff --git a/photologue/locale/fr/LC_MESSAGES/django.po b/photologue/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 00000000..66f1080a --- /dev/null +++ b/photologue/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,637 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-25 09:56+0000\n" +"PO-Revision-Date: 2013-11-20 11:06+0000\n" +"Last-Translator: richardbarran \n" +"Language-Team: French (http://www.transifex.com/projects/p/django-photologue/" +"language/fr/)\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "" +"Séparez les étiquettes par des espaces, mettez les étiquettes constituées de " +"plusieurs mots entre guillemets." + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "" +"Django-tagging n'a pas été trouvé, les étiquettes seront traitées comme du " +"texte simple." + +#: models.py:115 +msgid "Very Low" +msgstr "Très Bas" + +#: models.py:116 +msgid "Low" +msgstr "Bas" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Moyen-Bas" + +#: models.py:118 +msgid "Medium" +msgstr "Moyen" + +#: models.py:119 +msgid "Medium-High" +msgstr "Moyen-Haut" + +#: models.py:120 +msgid "High" +msgstr "Haut" + +#: models.py:121 +msgid "Very High" +msgstr "Très Haut" + +#: models.py:126 +msgid "Top" +msgstr "Sommet" + +#: models.py:127 +msgid "Right" +msgstr "Droite" + +#: models.py:128 +msgid "Bottom" +msgstr "Bas" + +#: models.py:129 +msgid "Left" +msgstr "Gauche" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Centré (par défaut)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Inversion de gauche à droite" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Inversion de haut en bas" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Rotation de 90 degrés dans le sens anti-horloger" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "Rotation de 90 degrés dans le sens horloger" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "Rotation de 180 degrés" + +#: models.py:142 +msgid "Tile" +msgstr "Mozaïque" + +#: models.py:143 +msgid "Scale" +msgstr "Redimensionner" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" + +#: models.py:159 +msgid "date published" +msgstr "date de publication" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "titre" + +#: models.py:164 +msgid "title slug" +msgstr "version abrégée du titre" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "" +"Un \"slug\" est un titre abrégé et unique, compatible avec les URL, pour un " +"objet." + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "description" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "est public" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Les galeries publiques seront affichée dans les vues par défaut." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "photos" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "étiquettes" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "galerie" + +#: models.py:188 +msgid "galleries" +msgstr "galleries" + +#: models.py:225 +msgid "count" +msgstr "nombre" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "fichier d'images (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "" +"Selectionnez un fichier .zip contenant des images à envoyer sur le serveur " +"dans une nouvelle Galerie." + +#: models.py:252 +#, fuzzy +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" +"Toutes les photos de la galerie auront un titre constitué du titre de la " +"galerie + un numéro de séquence." + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "légende" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "La légende sera ajoutée a toutes les photos." + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "Une description de cette Galerie." + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" +"Décochez cette case pour rendre la galerie des photos envoyées sur le " +"serveur et son contenu privés." + +#: models.py:276 +msgid "gallery upload" +msgstr "télécharger vers la gallerie" + +#: models.py:277 +msgid "gallery uploads" +msgstr "fichiers envoyés vers la galerie" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "image" + +#: models.py:395 +msgid "date taken" +msgstr "date de prise de vue" + +#: models.py:399 +msgid "view count" +msgstr "" + +#: models.py:402 +msgid "crop from" +msgstr "découper à partir de" + +#: models.py:411 +msgid "effect" +msgstr "effet" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Une taille de photo \"admin_thumbnail\" n'a pas encore été définie." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Miniature" + +#: models.py:649 +msgid "slug" +msgstr "libellé court" + +#: models.py:654 +msgid "date added" +msgstr "date d'ajout" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "Les photographies publique seront affichées dans les vues par défaut." + +#: models.py:668 +msgid "photo" +msgstr "photo" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "nom" + +#: models.py:801 +msgid "rotate or flip" +msgstr "rotation ou inversion" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "couleur" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" +"Un facteur de 0.0 donne une image en noir et blanc, un facteur de 1.0 donne " +"l'image originale." + +#: models.py:808 +msgid "brightness" +msgstr "brillance" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Un facteur de 0.0 donne une image noire, un facteur de 1.0 donne l'image " +"originale." + +#: models.py:811 +msgid "contrast" +msgstr "contraste" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Un facteur de 0.0 donne une image grise, un facteur de 1.0 donne l'image " +"originale." + +#: models.py:814 +msgid "sharpness" +msgstr "netteté" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Une facteur de 0.0 donne une image floue, un facteur de 1.0 donne l'image " +"d'origine." + +#: models.py:817 +msgid "filters" +msgstr "filtres" + +#: models.py:821 +msgid "size" +msgstr "taille" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"La hauteur de la réflection sous la forme d'un pourcentage de l'image " +"d'origine. Un facteur de 0.0 n'ajoute aucune réflection, un facteur de 1.0 " +"ajoute une réflection égale à la hauteur de l'image d'origine." + +#: models.py:824 +msgid "strength" +msgstr "force" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "" + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "effet photo" + +#: models.py:834 +msgid "photo effects" +msgstr "effets photo" + +#: models.py:865 +msgid "style" +msgstr "style" + +#: models.py:869 +msgid "opacity" +msgstr "opacité" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "L'opacité de la surcouche." + +#: models.py:874 +msgid "watermark" +msgstr "filigrane" + +#: models.py:875 +msgid "watermarks" +msgstr "filigranes" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"Le nom de la taille de la photo ne doit contenir que des lettres, des " +"chiffres et des caractères de soulignement. Exemples: \"miniature\", " +"\"affichage\", \"petit\", \"widget_page_principale\"." + +#: models.py:898 +msgid "width" +msgstr "largeur" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" +"Si la largeur est réglée à \"0\" l l'image sera redimensionnée par rapport à " +"la hauteur fournie." + +#: models.py:901 +msgid "height" +msgstr "hauteur" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" +"Si la hauteur est réglée à \"0\" l l'image sera redimensionnée par rapport à " +"la largeur fournie." + +#: models.py:904 +msgid "quality" +msgstr "qualité" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "Qualité JPEG de l'image." + +#: models.py:908 +msgid "upscale images?" +msgstr "agrandir les images ?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" +"Si sélectionné l'image sera agrandie si nécessaire pour coïncider avec les " +"dimensions fournies. Les dimensions ajustées seront agrandies sans prendre " +"en compte ce paramètre." + +#: models.py:911 +msgid "crop to fit?" +msgstr "découper pour adapter à la taille ?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"Si sélectionné l'image sera redimensionnée et recadrée pour coïncider avec " +"les dimensions fournies." + +#: models.py:914 +msgid "pre-cache?" +msgstr "mise en cache ?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" +"Si sélectionné cette taille de photo sera mise en cache au moment au les " +"photos sont ajoutées." + +#: models.py:917 +msgid "increment view count?" +msgstr "incrémenter le nombre d'affichages ?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"Si sélectionné le \"view_count\" (nombre d'affichage) de l'image sera " +"incrémenté quand cette taille de photo sera affichée." + +#: models.py:929 +msgid "watermark image" +msgstr "placer un filigrane sur l'image" + +#: models.py:933 +msgid "photo size" +msgstr "taille de la photo" + +#: models.py:934 +msgid "photo sizes" +msgstr "tailles des photos" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "" diff --git a/photologue/locale/hu/LC_MESSAGES/django.mo b/photologue/locale/hu/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..4e2603f032fd5aa5660c8864ee7ccedbf329b053 GIT binary patch literal 9075 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 Ny3rtPAi6Oj{|o9hcV++p literal 0 HcmV?d00001 diff --git a/photologue/locale/hu/LC_MESSAGES/django.po b/photologue/locale/hu/LC_MESSAGES/django.po new file mode 100644 index 00000000..a3194934 --- /dev/null +++ b/photologue/locale/hu/LC_MESSAGES/django.po @@ -0,0 +1,640 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-25 09:56+0000\n" +"PO-Revision-Date: 2013-11-20 11:06+0000\n" +"Last-Translator: richardbarran \n" +"Language-Team: Hungarian (http://www.transifex.com/projects/p/django-" +"photologue/language/hu/)\n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "" +"A címkéket szóközzel kell elválasztani, a több szavas címkék idézőjelek közé " +"írhatóak." + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "" +"A Django-tagging nem található, a címkék sima szövegként lesznek kezelve." + +#: models.py:115 +msgid "Very Low" +msgstr "Nagyon alacsony" + +#: models.py:116 +msgid "Low" +msgstr "Alacsony" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Közepesen alacsony" + +#: models.py:118 +msgid "Medium" +msgstr "Közepes" + +#: models.py:119 +msgid "Medium-High" +msgstr "Közepesen magas" + +#: models.py:120 +msgid "High" +msgstr "Magas" + +#: models.py:121 +msgid "Very High" +msgstr "Nagyon magas" + +#: models.py:126 +msgid "Top" +msgstr "Teteje" + +#: models.py:127 +msgid "Right" +msgstr "Jobb oldala" + +#: models.py:128 +msgid "Bottom" +msgstr "Alja" + +#: models.py:129 +msgid "Left" +msgstr "Bal oldala" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Közepe (Alapértelmezett)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Függőleges tengely mentén tükrözés" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Vízszintes tengely mentén tükrözés" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Óramutató járásával ellenkező irányba 90 fok forgatása" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "Óramutató járásával megegyező irányba 90 fok forgatás" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "180 fokos forgtás" + +#: models.py:142 +msgid "Tile" +msgstr "Cím" + +#: models.py:143 +msgid "Scale" +msgstr "Skála" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" +"Több szűrőt is alkalmazhat egymás után a következő mintára:\"SZŰRŐ_EGY-" +">SZŰRŐ_KETTŐ->SZŰRŐ_HÁROM\". A szűrők a megadott sorrendben, egymás után " +"lesznek a képre alkalmazva. A következő szűrők állnak rendelkezésére: %s" + +#: models.py:159 +msgid "date published" +msgstr "publikálás dátuma" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "cím" + +#: models.py:164 +msgid "title slug" +msgstr "cím slug" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "A \"slug\" egy objektum egyedi, URL-be ágyazható leírása." + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "leírás" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "publikus" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "A publikus galériák láthatóak lesznek az alapértelmezett nézetekben." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "fotók" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "címkék" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "galéria" + +#: models.py:188 +msgid "galleries" +msgstr "galériák" + +#: models.py:225 +msgid "count" +msgstr "számláló" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "tömörített fájl (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "" +"Válasszon ki egy .zip fájl, amely a galériába kerülő képeket tartalmazza''" + +#: models.py:252 +#, fuzzy +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" +"Minden, a galériában szereplő fotónak az lesz a címe, ami a galéria címe is," +"+ egy növekvő számláló" + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "képaláírás" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "A képaláírás minden új fotóra érvényes lesz." + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "A galéria leírása." + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" +"Vegye ki a pipát, ha a feltöltött galériát és a benne lévő fotókat priváttá " +"akarja tenni." + +#: models.py:276 +msgid "gallery upload" +msgstr "galéria feltöltés" + +#: models.py:277 +msgid "gallery uploads" +msgstr "galéria feltöltések" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "kép" + +#: models.py:395 +msgid "date taken" +msgstr "készítés dátuma" + +#: models.py:399 +msgid "view count" +msgstr "" + +#: models.py:402 +msgid "crop from" +msgstr "kivágás" + +#: models.py:411 +msgid "effect" +msgstr "szűrő" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Nincs definiálva \"admin_thumbnail\" fotó méret." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Kicsinyített kép" + +#: models.py:649 +msgid "slug" +msgstr "slug" + +#: models.py:654 +msgid "date added" +msgstr "hozzáadva" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "A publikus fotók megjelennek az alapértelmezett nézetekben." + +#: models.py:668 +msgid "photo" +msgstr "fotó" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "név" + +#: models.py:801 +msgid "rotate or flip" +msgstr "forgatás vagy türközés" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "színek" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" +"A 0.0-ás érték fekete-fehér képet, az 1.0-ás pedig az eredeti, színek képet " +"eredményezi" + +#: models.py:808 +msgid "brightness" +msgstr "fényerő" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" +"A 0.0-ás érték egy fekete képet, az 1.0-ás pedig az eredeti képet " +"eredményezi." + +#: models.py:811 +msgid "contrast" +msgstr "kontraszt" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "" +"A 0.0-ás érték egy egyszínű, szürke képet, az 1.0-ás érték pedig az eredeti " +"képet eredményezi." + +#: models.py:814 +msgid "sharpness" +msgstr "élesség" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" +"A 0.0-ás érték egy elmosott képet, az 1.0-ás érték pedig az eredeti képet " +"eredményezi." + +#: models.py:817 +msgid "filters" +msgstr "szűrők" + +#: models.py:821 +msgid "size" +msgstr "méret" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"A tükröződés magasságát az eredeti kép magasságának százalékában kell " +"megadni. A 0.0-ás érték egy tükröződés nélküli képet, az 1.0-ás érték pedig " +"egy, Az eredeti kép magasságával megegyező magasságú tükröződést tartalmazó " +"képet eremdényez." + +#: models.py:824 +msgid "strength" +msgstr "erősség" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "A tükröződés elhalványodásának kezdő átlátszósága." + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" +"A tükröződés színátmenetének háttérszíne. Állítsa be olyan színűre, amilyen " +"színű háttérre kerül a kép!" + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "fotó effekt" + +#: models.py:834 +msgid "photo effects" +msgstr "fotó effektek" + +#: models.py:865 +msgid "style" +msgstr "stílus" + +#: models.py:869 +msgid "opacity" +msgstr "átlátszóság" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "A felső réteg átlátszósága." + +#: models.py:874 +msgid "watermark" +msgstr "vízjel" + +#: models.py:875 +msgid "watermarks" +msgstr "vízjelek" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"A fotó méretek neve csak kis betűket, számokat és aláhúzásjeleket " +"tartalmazhat. Pl.: \"thumbnail\", \"display\", \"small\", \"main_page_widget" +"\"." + +#: models.py:898 +msgid "width" +msgstr "szélesség" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" +"Ha a szélességet 0-ra állítja, a kép a megadott magasság alapján arányosan " +"fog méreteződni." + +#: models.py:901 +msgid "height" +msgstr "magasság" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" +"Ha a magasságot 0-ra állítja, a kép a megadott magasság alapján arányosan " +"fog méreteződni." + +#: models.py:904 +msgid "quality" +msgstr "minőség" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "JPEG minőség" + +#: models.py:908 +msgid "upscale images?" +msgstr "képek felméretezése?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" +"Ha be van állítva, akkor a megadott méretnél kisebb képek fel lesznek " +"méretezve, hogy kitöltsék a rendelkezésre álló helyet. Képkivágás esetén " +"ettől az opciótól függetlenül mindenképpen fel lesznek méretezve a képek " +"szükség esetén." + +#: models.py:911 +msgid "crop to fit?" +msgstr "képkivágás?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"Ha be van állítva, akkor a képek úgy lesznek átméretezve a megadott " +"képarárnyra, hogy egy részük le lesz vágva." + +#: models.py:914 +msgid "pre-cache?" +msgstr "előre generálás?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" +"Ha be van állítva, akkor a hozzáadáskor előre le lesz a fotó generálva erre " +"a méretre." + +#: models.py:917 +msgid "increment view count?" +msgstr "nézettségi számláló növelése?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"Ha be van állítva, akkor a kép \"view_count\" mezőjében lévő érték minden " +"megjelenítés után egyel növekedni fog." + +#: models.py:929 +msgid "watermark image" +msgstr "vízjelhez felhasznált kép" + +#: models.py:933 +msgid "photo size" +msgstr "fotó méret" + +#: models.py:934 +msgid "photo sizes" +msgstr "fotó méretek" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "" diff --git a/photologue/locale/it/LC_MESSAGES/django.mo b/photologue/locale/it/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..1c38acc3979f31b3d818a38c53c4204b8097e70d GIT binary patch literal 8748 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

      M_s zd)fMW--YuRR;FAcKi_u>wa2}*Hg^kHpd@M`&S(O=JDvRs*@N1e4;s& zBCID<;I&E@qAWX&eAU65Wc&S){FMw_VQ~w7v$G?Jl-hC6TGcVLYt!k{aZ!V_`R?~) zkL3HkN7WnUouvN0@6*Sh`a9fZ6(NojUw4bbC?me2Ad*a(Sfq=5NiPAiK4g|uRc->2 zZlXliCzilczVKv5I^e?c^BCibxxg|6RA}+E%Vt5i2{iHS8lZ~{Wux$Qj3o0 zYFAF;Q}S{=3ie_vV$?8c3Z?Z+S1w!C~NZ_CyR4dDj&-;k2UyPR!os&4Xd~%VG!APr8I#xVS8Lj4KICTPozNv zw+y=_;}TzCA@8s*=7oz>DSCA#?~;@iVo4)`6KS20s@ZfuFWmL(iG)TaHP6Vz#-dTdCS`vR)>Vb;_?}pUgrTT9NCu8W{Vs@+J9#dO8bDb-M4vr4Hx3|kV((;Y zPcAs#i95giPWU-Q*M+=2P>EbqclrEa*a-bBgJj6&qbP5)mpwgJct1U@o62Snf5d_VC?GX_k17c8hqf**Fa(Cv_|15_&}nV3L7M(6@CsOr!yi#Ju#h0LcuaJ z9lUVn$t`AALTq;7%{xb5JmEpuUG_J&Ph}ESl1e?TszuHhE!0-hbDvcXVK%ZsMP?}d ze{^f2kW+D^SWWK2RrlP&s{Z3^*F@V-;$D(a@iqT>D=50kzP#1ET-~Enx*%$T{*tYB z-L@_w{x{O&vr!(4Kt7XE1ad*k1XU^II#?W9sm~KB?jWfVYum1&#IAC~!jrPxVOhu- z$4RGhLe+>IPv#h$!Bn!iwZ=>s;+f;bI#FeC@Sfpv?vAO14~_C8>l9y-X{Z=O0W}?> zVhkhlzG#1y^ARa2eg1#VNV3|u#?xjTjM?Zo+(C%u${#`%iA1DpV^?dtI5{?;g+yRP zW|56>oRdrf_n=ZTdQmMGO^V6uo_wK9I-P+ZaT&SGZD02DQ0WJkOTtp*g8D%!*=PUnhfKmr^+P6QCfz3pg%BWm@`)*oH`x((Fr{)laGlL zk{C}t;_xxoL6#Gv(1znZSWa#gYfYSl6nNG*O!FLjbDpE9(?nc~RAv99Ph-Nj%5x@j zXXb_d6y#a1`!s>%c84&RLg5+Q6)9jm?=1Uf?$(~p7Ci+uE-DK%7YJ>^*35}sPbr{+ zoOaL6X$&t$AL3YEG>K*iD|}3sKaOSQ9&N&pC1ZQjH+WPcCp<gXf@WPOR-?}Zv2p##+`RTJ~ob7ssV3~r+8 zuQ3VIMCFl_QF%$_7GX5}-BcyBZy7wE>^EdrMxRf*N_nP)oC$?6-?Frw)BwlP)XOTA g@fPC=_(xI^z8cPI-fYP{W~Rj}-J*~-lZ4CsFGl|JE&u=k literal 0 HcmV?d00001 diff --git a/photologue/locale/it/LC_MESSAGES/django.po b/photologue/locale/it/LC_MESSAGES/django.po new file mode 100644 index 00000000..7a24b7b9 --- /dev/null +++ b/photologue/locale/it/LC_MESSAGES/django.po @@ -0,0 +1,638 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-25 09:56+0000\n" +"PO-Revision-Date: 2013-11-20 11:06+0000\n" +"Last-Translator: richardbarran \n" +"Language-Team: Italian (http://www.transifex.com/projects/p/django-" +"photologue/language/it/)\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "" +"Separa i tag con gli spazi e racchiudi tra virgolette tag composti da più " +"parole." + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "" +"Django-tagging non è stata trovata, i tag verranno trattati come testo " +"normale." + +#: models.py:115 +msgid "Very Low" +msgstr "Molto Bassa" + +#: models.py:116 +msgid "Low" +msgstr "Bassa" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Medio-Bassa" + +#: models.py:118 +msgid "Medium" +msgstr "Media" + +#: models.py:119 +msgid "Medium-High" +msgstr "Medio-Alta" + +#: models.py:120 +msgid "High" +msgstr "Alta" + +#: models.py:121 +msgid "Very High" +msgstr "Molto Alta" + +#: models.py:126 +msgid "Top" +msgstr "In alto" + +#: models.py:127 +msgid "Right" +msgstr "A destra" + +#: models.py:128 +msgid "Bottom" +msgstr "In basso" + +#: models.py:129 +msgid "Left" +msgstr "A sinistra" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Al centro (Default)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Inverti destra con sinistra" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Inverti alto con basso" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Ruota di 90 gradi in senso anti-orario" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "Ruota di 90 gradi in senso orario" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "Ruota di 180 gradi" + +#: models.py:142 +msgid "Tile" +msgstr "Affianca" + +#: models.py:143 +msgid "Scale" +msgstr "Ridimensiona" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" +"Collega filtri multipli in cascata con il seguente schema \"FILTRO_UNO-" +">FILTRO_DUE->FILTER_TRE\". I filtri saranno applicati in ordine alle " +"immagini. I seguenti filtri sono disponibili: %s." + +#: models.py:159 +msgid "date published" +msgstr "data di pubblicazione" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "titolo" + +#: models.py:164 +msgid "title slug" +msgstr "slug" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "Uno \"Slug\" è un titolo univoco per un oggetto, usabile come URL." + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "descrizione" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "è pubblica" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Le gallerie pubbliche verranno visualizzate nelle viste di default." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "foto" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "tag" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "galleria" + +#: models.py:188 +msgid "galleries" +msgstr "gallerie" + +#: models.py:225 +msgid "count" +msgstr "numero" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "file di immagini (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "Scegli un file .zip con le immagini da caricare in una nuova Galleria" + +#: models.py:252 +#, fuzzy +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" +"Tutte le foto di una galleria avranno un titolo composto dal titolo della " +"galleria più un numero sequenziale." + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "didascalia" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "La didascalia verrà aggiunta a tutte le foto" + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "Una descrizione di questa Galleria." + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" +"Deseleziona l'opzione per rendere private le immagini e la galleria una " +"volta caricata." + +#: models.py:276 +msgid "gallery upload" +msgstr "caricamento in blocco" + +#: models.py:277 +msgid "gallery uploads" +msgstr "caricamenti in blocco" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "immagine" + +#: models.py:395 +msgid "date taken" +msgstr "data dello scatto" + +#: models.py:399 +msgid "view count" +msgstr "" + +#: models.py:402 +msgid "crop from" +msgstr "ritagliata da" + +#: models.py:411 +msgid "effect" +msgstr "effetto" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "La dimensione \"admin_thumbnail\" non è ancora stata creata." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Miniatura" + +#: models.py:649 +msgid "slug" +msgstr "slug" + +#: models.py:654 +msgid "date added" +msgstr "data di inserimento" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "Le fotografie pubbliche verranno visualizzate nelle viste di default." + +#: models.py:668 +msgid "photo" +msgstr "fotografia" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "nome" + +#: models.py:801 +msgid "rotate or flip" +msgstr "ruota o inverti" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "colore" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" +"Un fattore di 0.0 restituisce un'immagine in bianco e nero, un fattore di " +"1.0 restituisce l'immagine originale." + +#: models.py:808 +msgid "brightness" +msgstr "luminosità" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Un fattore di 0.0 restituisce un'immagine nera, un fattore di 1.0 " +"restituisce l'immagine originale." + +#: models.py:811 +msgid "contrast" +msgstr "contrasto" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Un fattore di 0.0 restituisce un'immagine grigia, un fattore di 1.0 " +"restituisce l'immagine originale." + +#: models.py:814 +msgid "sharpness" +msgstr "nitidezza" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Un fattore di 0.0 restituisce un'immagine sfuocata, un fattore di 1.0 " +"restituisce l'immagine originale." + +#: models.py:817 +msgid "filters" +msgstr "filtri" + +#: models.py:821 +msgid "size" +msgstr "dimensione" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"L'altezza del riflesso come percentuale dell'immagine originale. Un fattore " +"di 0.0 non aggiunge nessun riflesso, un fattore di 1.0 aggiunge un riflesso " +"della stessa altezza dell'immagine originale." + +#: models.py:824 +msgid "strength" +msgstr "intensità" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "Opacità iniziale del gradiente del riflesso." + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" +"Il colore di sfondo del gradiente di riflesso. Sceglilo in modo che " +"corrisponda al colore dello sfondo della tua immagine." + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "effetto fotografico" + +#: models.py:834 +msgid "photo effects" +msgstr "effetti fotografici" + +#: models.py:865 +msgid "style" +msgstr "stile" + +#: models.py:869 +msgid "opacity" +msgstr "opacità" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "Opacità della copertura" + +#: models.py:874 +msgid "watermark" +msgstr "watermark" + +#: models.py:875 +msgid "watermarks" +msgstr "watermark" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"Le dimensioni fotografiche devono contenere solo lettere, numeri o caratteri " +"di sottolineatura. Per esempio: : \"thumbnail\", \"display\", \"small\", " +"\"main_page_widget\"." + +#: models.py:898 +msgid "width" +msgstr "larghezza" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" +"Se la dimensione è \"0\", l'immagine verrà ridimensionata all'altezza " +"specificata." + +#: models.py:901 +msgid "height" +msgstr "altezza" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" +"Se l'altezza è \"0\", l'immagine verrà ridimensionata alla larghezza " +"specificata." + +#: models.py:904 +msgid "quality" +msgstr "qualità" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "qualità dell'immagine JPEG" + +#: models.py:908 +msgid "upscale images?" +msgstr "ingrandisco le immagini?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" +"Se selezionato, l'immagine verrà ingrandita (se necessario) per " +"corrispondere alle dimensioni specificate. Dimensioni ritagliate verranno " +"ridimensionate senza tenere conto di questa configurazione." + +#: models.py:911 +msgid "crop to fit?" +msgstr "Ritaglio per stare nelle dimensioni?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"Se selezionato, l'immagine verrà ridimensionata e ritagliata per rientrare " +"nelle dimensioni specificate." + +#: models.py:914 +msgid "pre-cache?" +msgstr "pre-cache?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" +"Se selezionato, questa dimensione di foto verrà pre-salvata mentre le foto " +"sono inserite." + +#: models.py:917 +msgid "increment view count?" +msgstr "incrementa il contatore di visualizzazioni?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"Se selezionato, il \"contatore di visualizzazioni\" dell'immagine sarà " +"incrementato ad ogni visualizzazione dell'immagine." + +#: models.py:929 +msgid "watermark image" +msgstr "immagine di watermark" + +#: models.py:933 +msgid "photo size" +msgstr "dimensione della foto" + +#: models.py:934 +msgid "photo sizes" +msgstr "dimensioni delle foto" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "" diff --git a/photologue/locale/nl/LC_MESSAGES/django.mo b/photologue/locale/nl/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..c1556217b90e75aaf4a0be180ec5da027d930a11 GIT binary patch literal 8594 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, 2009 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-25 09:56+0000\n" +"PO-Revision-Date: 2013-11-20 11:06+0000\n" +"Last-Translator: richardbarran \n" +"Language-Team: Dutch (http://www.transifex.com/projects/p/django-photologue/" +"language/nl/)\n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "" +"Scheid labels met spaties, plaats aanhalingstekens rond labels met meerdere " +"woorden." + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "" +"Django-tagging kon niet gevonden worden, labels worden behandeld als platte " +"tekst." + +#: models.py:115 +msgid "Very Low" +msgstr "Zeer laag" + +#: models.py:116 +msgid "Low" +msgstr "Laag" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Middel-laag" + +#: models.py:118 +msgid "Medium" +msgstr "Gemiddeld" + +#: models.py:119 +msgid "Medium-High" +msgstr "Middel-hoog" + +#: models.py:120 +msgid "High" +msgstr "Hoog" + +#: models.py:121 +msgid "Very High" +msgstr "Zeer hoog" + +#: models.py:126 +msgid "Top" +msgstr "Boven" + +#: models.py:127 +msgid "Right" +msgstr "Rechts" + +#: models.py:128 +msgid "Bottom" +msgstr "Onder" + +#: models.py:129 +msgid "Left" +msgstr "Links" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Midden (standaard)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Spiegel horizontaal" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Spiegel verticaal" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Roteer 90 graden linksom" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "Roteer 90 graden rechtsom" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "Roteer 180 graden" + +#: models.py:142 +msgid "Tile" +msgstr "Tegelen" + +#: models.py:143 +msgid "Scale" +msgstr "Schalen" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" +"Keten meerdere filters aan elkaar met het patroon: \"FILTER_EEN->FILTER_TWEE-" +">FILTER_DRIE\". Afbeeldingsfilters worden in volgorde toegepast. De volgende " +"filters zijn beschikbaar: %s." + +#: models.py:159 +msgid "date published" +msgstr "datum gepubliceerd" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "titel" + +#: models.py:164 +msgid "title slug" +msgstr "titel 'slug'" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "Een \"slug\" is een unieke URL-vriendelijke titel voor een object." + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "beschrijving" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "is openbaar" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Openbare galerijen worden weergegeven in de standaardviews." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "foto's" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "labels" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "galerij" + +#: models.py:188 +msgid "galleries" +msgstr "galerijen" + +#: models.py:225 +msgid "count" +msgstr "aantal" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "afbeeldingenbestand (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "" +"Kies een .zip-bestand met afbeeldingen om te uploaden naar een nieuwe " +"Galerij." + +#: models.py:252 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "onderschrift" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "Onderschrift wordt toegevoegd aan alle foto's." + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "Een beschrijving van deze Galerij." + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Haal dit vinkje weg om de geüploade galerij en foto's privé te maken." + +#: models.py:276 +msgid "gallery upload" +msgstr "galerij-upload" + +#: models.py:277 +msgid "gallery uploads" +msgstr "galerij-uploads" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "afbeelding" + +#: models.py:395 +msgid "date taken" +msgstr "datum genomen" + +#: models.py:399 +msgid "view count" +msgstr "" + +#: models.py:402 +msgid "crop from" +msgstr "afknippen vanaf" + +#: models.py:411 +msgid "effect" +msgstr "effect" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Er is geen \"admin_thumbnail\" foto-maat vastgelegd." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Miniatuur" + +#: models.py:649 +msgid "slug" +msgstr "slug" + +#: models.py:654 +msgid "date added" +msgstr "datum toegevoegd" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "Openbare foto's worden weergegeven in de standaardviews." + +#: models.py:668 +msgid "photo" +msgstr "foto" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "naam" + +#: models.py:801 +msgid "rotate or flip" +msgstr "roteer of spiegel" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "kleur" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" +"Een factor van 0.0 geeft een zwart-wit afbeelding, een factor van 1.0 geeft " +"de originele afbeelding." + +#: models.py:808 +msgid "brightness" +msgstr "helderheid" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Een factor van 0.0 geeft een zwarte afbeelding, een factor van 1.0 geeft de " +"originele afbeelding." + +#: models.py:811 +msgid "contrast" +msgstr "contrast" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Een factor van 0.0 geeft een egaal grijze afbeelding, een factor van 1.0 " +"geeft de originele afbeelding." + +#: models.py:814 +msgid "sharpness" +msgstr "scherpte" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Een factor van 0.0 geeft een vervaagde afbeelding, een factor van 1.0 geeft " +"de originele afbeelding." + +#: models.py:817 +msgid "filters" +msgstr "filters" + +#: models.py:821 +msgid "size" +msgstr "afmeting" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"De hoogte van de reflectie als precentage van de originele afbeelding. Een " +"factor van 0.0 voegt geen reflectie toe, een factor van 1.0 voegt een " +"reflectie toe met een gelijke hoogte als de originele afbeelding." + +#: models.py:824 +msgid "strength" +msgstr "sterkte" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "De initiële doorzichtigheid van de reflectie-gradatie." + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" +"De achtergrondkleur van de reflectie-gradatie. Stel dit in als hetzelfde als " +"de achtergrondkleur van je pagina." + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "foto-effect" + +#: models.py:834 +msgid "photo effects" +msgstr "foto-effecten" + +#: models.py:865 +msgid "style" +msgstr "stijl" + +#: models.py:869 +msgid "opacity" +msgstr "doorzichtigheid" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "De doorzichtigheid van overliggende afbeelding." + +#: models.py:874 +msgid "watermark" +msgstr "watermerk" + +#: models.py:875 +msgid "watermarks" +msgstr "watermerken" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"De naam van de foto-maat mag alleen letters, nummers en underscores " +"bevatten. Voorbeelden: \"miniatuur\", \"weergave\", \"klein\", " +"\"hoofdpagina_zijbalk_miniatuur\"." + +#: models.py:898 +msgid "width" +msgstr "breedte" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" +"Als de breedte op \"0\" wordt gezet zal de afbeelding geschaald worden naar " +"de opgegeven hoogte." + +#: models.py:901 +msgid "height" +msgstr "hoogte" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" +"Als de hoogte op \"0\" wordt gezet zal de afbeelding geschaald worden naar " +"de opgegeven breedte." + +#: models.py:904 +msgid "quality" +msgstr "kwaliteit" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "JPEG afbeeldingskwaliteit" + +#: models.py:908 +msgid "upscale images?" +msgstr "afbeeldingen opschalen?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" +"Als dit is gekozen zal de afbeelding, indien nodig, opgeschaald worden naar " +"opgegeven afmetingen. Afgeknipte maten worden altijd opgeschaald, ongeacht " +"deze instelling." + +#: models.py:911 +msgid "crop to fit?" +msgstr "gepast afknippen?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"Als dit is gekozen zal de afbeelding geschaald en afgeknipt worden naar de " +"opgegeven afmetingen." + +#: models.py:914 +msgid "pre-cache?" +msgstr "vooraf cachen?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" +"Als dit is gekozen zullen foto's met deze foto-maat van te voren worden " +"gecached wanneer ze worden toegevoegd." + +#: models.py:917 +msgid "increment view count?" +msgstr "aantal vertoningen ophogen?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"Als dit is gekozen zal het aantal vertoningen van de afbeelding worden " +"opgehoogd wanneer deze foto-maat wordt weergegeven." + +#: models.py:929 +msgid "watermark image" +msgstr "watermerk-afbeelding" + +#: models.py:933 +msgid "photo size" +msgstr "foto-maat" + +#: models.py:934 +msgid "photo sizes" +msgstr "foto-maten" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "" diff --git a/photologue/locale/no/LC_MESSAGES/django.mo b/photologue/locale/no/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..326da3f7b5880eeb8ad6c920216dba3a40e0555c GIT binary patch literal 7494 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\n" +"Language-Team: Norwegian (http://www.transifex.com/projects/p/django-" +"photologue/language/no/)\n" +"Language: no\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "" +"Separer tagger med mellomrom, bruk hermetegn rundt tagger som består av " +"flere ord." + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "" +"Django-tagging ble ikke funnet. Tagger vil bli behandlet som vanlig tekst." + +#: models.py:115 +msgid "Very Low" +msgstr "Veldig lav" + +#: models.py:116 +msgid "Low" +msgstr "Lav" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Middels-lav" + +#: models.py:118 +msgid "Medium" +msgstr "Middels" + +#: models.py:119 +msgid "Medium-High" +msgstr "Middels-høy" + +#: models.py:120 +msgid "High" +msgstr "Høy" + +#: models.py:121 +msgid "Very High" +msgstr "Veldig høy" + +#: models.py:126 +msgid "Top" +msgstr "Topp" + +#: models.py:127 +msgid "Right" +msgstr "Høyre" + +#: models.py:128 +msgid "Bottom" +msgstr "Bunn" + +#: models.py:129 +msgid "Left" +msgstr "Venstre" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Senter (forhåndsvalgt)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Snu venstre mot høyre" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Snu topp mot bunn" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Rotér 90 grader mot klokka" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "Rotér 90 grader med klokka" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "Rotér 180 grader" + +#: models.py:142 +msgid "Tile" +msgstr "Flislegg" + +#: models.py:143 +msgid "Scale" +msgstr "Skalér" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" + +#: models.py:159 +msgid "date published" +msgstr "publiseringsdato" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "tittel" + +#: models.py:164 +msgid "title slug" +msgstr "tittel (slug)" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "En \"slug\" er en unik URL-vennlig tittel for et objekt." + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "beskrivelse" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "publisert" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Publiserte gallerier vil bli vist på vanlig vis." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "bilder" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "tagger" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "galleri" + +#: models.py:188 +msgid "galleries" +msgstr "gallerier" + +#: models.py:225 +msgid "count" +msgstr "visninger" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "pakkede bildefiler (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "Velg en .zip-fil med bilder for å laste opp som et nytt galleri." + +#: models.py:252 +#, fuzzy +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" +"Alle bilder i dette galleriet vil bli gitt navn etter galleriets navn + " +"bildets nummer." + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "undertittel" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "Undertitler blir lagt til på alle bilder." + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "Beskrivelse av galleriet." + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Avmarker dette for å gjøre galleriet og dets bilder private." + +#: models.py:276 +msgid "gallery upload" +msgstr "galleriopplasting" + +#: models.py:277 +msgid "gallery uploads" +msgstr "galleriopplastinger" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "bilde" + +#: models.py:395 +msgid "date taken" +msgstr "dato tatt" + +#: models.py:399 +msgid "view count" +msgstr "" + +#: models.py:402 +msgid "crop from" +msgstr "kutt fra" + +#: models.py:411 +msgid "effect" +msgstr "effekt" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "En \"admin_thumbnail\"-bildestørrelse har ikke blitt opprettet." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Miniatyrbilde" + +#: models.py:649 +msgid "slug" +msgstr "slug" + +#: models.py:654 +msgid "date added" +msgstr "opplastingsdato" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "Publiserte bilder vil bli vist på vanlig måte." + +#: models.py:668 +msgid "photo" +msgstr "bilde" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "navn" + +#: models.py:801 +msgid "rotate or flip" +msgstr "rotér og snu" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "farge" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" +"En verdi på 0.0 gir et sort/hvitt-bilde, en verdi på 1.0 gir originalbildet." + +#: models.py:808 +msgid "brightness" +msgstr "lyshet" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "En verdi på 0.0 gir et sort bilde, en verdi på 1.0 gir originalbildet." + +#: models.py:811 +msgid "contrast" +msgstr "kontrast" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "" +"En verdi på 0.0 gir et grått bilde, en verdi på 1.0 gir originalbildet." + +#: models.py:814 +msgid "sharpness" +msgstr "skarphet" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" +"En verdi på 0.0 gir et utydlig bilde, en verdi på 1.0 gir originalbildet." + +#: models.py:817 +msgid "filters" +msgstr "filter" + +#: models.py:821 +msgid "size" +msgstr "størrelse" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"Høyden av refleksjonen som prosent av originalbildet. En verdi på 0.0 gir " +"ingen refleksjon, en verdi på 1.0 gir en refleksjon tilsvarende høyden på " +"originalbildet." + +#: models.py:824 +msgid "strength" +msgstr "styrke" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "" + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "bildeeffekt" + +#: models.py:834 +msgid "photo effects" +msgstr "bildeeffekter" + +#: models.py:865 +msgid "style" +msgstr "stil" + +#: models.py:869 +msgid "opacity" +msgstr "gjennomsiktighet" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "Gjennomsiktigheten av overlegget." + +#: models.py:874 +msgid "watermark" +msgstr "vannmerke" + +#: models.py:875 +msgid "watermarks" +msgstr "vannmerker" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"Navn på bildestørrelse kan kun inneholde bokstaver, tall og understreker. " +"Eksempler: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." + +#: models.py:898 +msgid "width" +msgstr "bredde" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" +"Hvis bredden er satt til \"0\" blir bildet skalert til den oppgitte høyden." + +#: models.py:901 +msgid "height" +msgstr "høyde" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" +"Hvis høyden er satt til \"0\" blir bildet skalert til den oppgitte bredden." + +#: models.py:904 +msgid "quality" +msgstr "kvalitet" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "JPEG bildekvalitet" + +#: models.py:908 +msgid "upscale images?" +msgstr "oppskalér bilder?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" +"Hvis valgt, blir bildet vil bli skalert opp om det er nødvendig. Kuttede " +"størrelser vil bli oppskalert uansett innstilling." + +#: models.py:911 +msgid "crop to fit?" +msgstr "kutt for tilpasning?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"Hvis valgt blir bildet skalert og kuttet for å passe med den oppgitte " +"størrelsen." + +#: models.py:914 +msgid "pre-cache?" +msgstr "mellomlagre på forhånd?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" +"Hvis valgt blir denne bildestørrelsen mellomlagret på forhånd når nye bilder " +"blir lagt til." + +#: models.py:917 +msgid "increment view count?" +msgstr "øke visningstelleren?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"Hvis valgt vil \"visningstelleren\" øke hver gang denne bildestørrelsen " +"vises." + +#: models.py:929 +msgid "watermark image" +msgstr "vannmerke på bilde" + +#: models.py:933 +msgid "photo size" +msgstr "bildestørrelse" + +#: models.py:934 +msgid "photo sizes" +msgstr "bildestørrelser" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "" diff --git a/photologue/locale/pl/LC_MESSAGES/django.mo b/photologue/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..d31d6a214848c82b2b6627e9a59396e63f0c1933 GIT binary patch literal 7786 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 literal 0 HcmV?d00001 diff --git a/photologue/locale/pl/LC_MESSAGES/django.po b/photologue/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 00000000..0b259b6b --- /dev/null +++ b/photologue/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,636 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-25 09:56+0000\n" +"PO-Revision-Date: 2013-11-20 11:06+0000\n" +"Last-Translator: richardbarran \n" +"Language-Team: Polish (http://www.transifex.com/projects/p/django-photologue/" +"language/pl/)\n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "Rozdziel tagi spacjami, ujmij w cudzysłowy tagi złożone z wielu słów." + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "" +"Django-tagging nie zostało znalezione. Tagi będą traktowane jako czysty " +"tekst." + +#: models.py:115 +msgid "Very Low" +msgstr "Bardzo niska" + +#: models.py:116 +msgid "Low" +msgstr "Niska" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Niższa średnia" + +#: models.py:118 +msgid "Medium" +msgstr "Średnia" + +#: models.py:119 +msgid "Medium-High" +msgstr "Wyższa średnia" + +#: models.py:120 +msgid "High" +msgstr "Wysoka" + +#: models.py:121 +msgid "Very High" +msgstr "Bardzo wysoka" + +#: models.py:126 +msgid "Top" +msgstr "Góra" + +#: models.py:127 +msgid "Right" +msgstr "Prawo" + +#: models.py:128 +msgid "Bottom" +msgstr "Dół" + +#: models.py:129 +msgid "Left" +msgstr "Lewo" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Środek (Domyślnie)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Odbij w poziomie" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Odbij w pionie" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Odwróć 90 stopni w lewo" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "Odwróć 90 stopni w prawo" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "Obróć o 180 stopni" + +#: models.py:142 +msgid "Tile" +msgstr "Kafelki" + +#: models.py:143 +msgid "Scale" +msgstr "Skaluj" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" + +#: models.py:159 +msgid "date published" +msgstr "data publikacji" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "tytuł" + +#: models.py:164 +msgid "title slug" +msgstr "tytuł - slug " + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "\"Slug\" jest unikalnym, zgodnym z formatem dla URL-i tytułem obiektu." + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "opis" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "jest publiczna" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Galerie publiczne będą wyświetlana w domyślnych widokach." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "zdjęcia" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "tagi" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "galeria" + +#: models.py:188 +msgid "galleries" +msgstr "galerie" + +#: models.py:225 +msgid "count" +msgstr "ilość" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "plik z obrazami (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "" +"Wybierz plik .zip zawierający zdjęcia które chcesz załadować do nowej " +"Galerii." + +#: models.py:252 +#, fuzzy +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "Wszystkie " + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "podpis" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "Podpis będzie dodany do wszystkich zdjęć." + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "Opis tej Galerii." + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" +"Odznacz aby uczynić wrzucaną galerię oraz zawarte w niej zdjęcia prywatnymi." + +#: models.py:276 +msgid "gallery upload" +msgstr "wrzucona galeria" + +#: models.py:277 +msgid "gallery uploads" +msgstr "wrzucone galerie" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "obraz" + +#: models.py:395 +msgid "date taken" +msgstr "data wykonania" + +#: models.py:399 +msgid "view count" +msgstr "" + +#: models.py:402 +msgid "crop from" +msgstr "obetnij z" + +#: models.py:411 +msgid "effect" +msgstr "efekt" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Rozmiar zdjęcia \"admin_thumbnail\" nie został zdefiniowany." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Miniaturka" + +#: models.py:649 +msgid "slug" +msgstr "slug" + +#: models.py:654 +msgid "date added" +msgstr "data dodania" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "Publiczne zdjęcia będą wyświetlane w domyślnych widokach." + +#: models.py:668 +msgid "photo" +msgstr "zdjęcie" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "nazwa" + +#: models.py:801 +msgid "rotate or flip" +msgstr "obróć lub odbij" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "kolor" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" +"Współczynnik 0.0 daje czarno-biały obraz, współczynnik 1.0 daje obraz " +"oryginalny." + +#: models.py:808 +msgid "brightness" +msgstr "jasność" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Współczynnik 0.0 daje czarny obraz, współczynnik 1.0 daje obraz oryginalny." + +#: models.py:811 +msgid "contrast" +msgstr "kontrast" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Współczynnik 0.0 daje jednolity szary obraz, współczynnik 1.0 daje obraz " +"oryginalny." + +#: models.py:814 +msgid "sharpness" +msgstr "ostrość" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Współczynnik 0.0 daje rozmazany obraz, współczynnik 1.0 daje obraz " +"oryginalny." + +#: models.py:817 +msgid "filters" +msgstr "filtry" + +#: models.py:821 +msgid "size" +msgstr "rozmiar" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"Wysokość odbicia jako procent oryginalnego obrazu. Współczynnik 0.0 nie " +"dodaje odbicia, współczynnik 1.0 dodaje odbicie równe wysokości oryginalnego " +"obrazu." + +#: models.py:824 +msgid "strength" +msgstr "intensywność" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "" + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "efekt zdjęcia" + +#: models.py:834 +msgid "photo effects" +msgstr "efekty zdjęć" + +#: models.py:865 +msgid "style" +msgstr "styl" + +#: models.py:869 +msgid "opacity" +msgstr "przeźroczystość" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "Poziom przezroczystości" + +#: models.py:874 +msgid "watermark" +msgstr "znak wodny" + +#: models.py:875 +msgid "watermarks" +msgstr "znaki wodne" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"Nazwa rozmiaru zdjęcia powinna zawierać tylko litery, cyfry i podkreślenia. " +"Przykłady: \"miniatura\", \"wystawa\", \"male\", \"widget_strony_glownej\"." + +#: models.py:898 +msgid "width" +msgstr "szerokość" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" +"Jeśli szerokość jest ustawiona na \"0\" to obraz będzie skalowany do podanej " +"wysokości." + +#: models.py:901 +msgid "height" +msgstr "wysokość" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" +"Jeśli wysokość jest ustawiona na \"0\" to obraz będzie skalowany do podanej " +"szerokości." + +#: models.py:904 +msgid "quality" +msgstr "jakość" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "Jakość obrazu JPEG" + +#: models.py:908 +msgid "upscale images?" +msgstr "skalować obrazy w górę?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" +"Jeśli zaznaczone to obraz będzie skalowany w górę tak aby pasował do " +"podanych wymiarów. Obcinane rozmiary będą skalowane niezależnie od tego " +"ustawienia." + +#: models.py:911 +msgid "crop to fit?" +msgstr "przyciąć aby pasował?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"Jeśli zaznaczone to obraz będzie skalowany i przycinany tak aby pasował do " +"podanych wymiarów." + +#: models.py:914 +msgid "pre-cache?" +msgstr "wstępnie cachować?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" +"Jesli zaznaczone to ten rozmiar zdjęć będzie wstępnie cachowany przy " +"dodawaniu zdjęć." + +#: models.py:917 +msgid "increment view count?" +msgstr "zwiększyć licznik odsłon?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"Jeśli zaznaczone to \"licznik_odslon\" będzie zwiększany gdy ten rozmiar " +"zdjęcia będzie wyświetlany." + +#: models.py:929 +msgid "watermark image" +msgstr "oznacz kluczem wodnym" + +#: models.py:933 +msgid "photo size" +msgstr "rozmiar zdjęcia" + +#: models.py:934 +msgid "photo sizes" +msgstr "rozmiary zdjęć" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "" diff --git a/photologue/locale/pt/LC_MESSAGES/django.mo b/photologue/locale/pt/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..df43fff03496c31eda46ce2a5501dd2be422a778 GIT binary patch literal 8625 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, 2009 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-25 09:56+0000\n" +"PO-Revision-Date: 2013-11-20 11:06+0000\n" +"Last-Translator: richardbarran \n" +"Language-Team: Portuguese (http://www.transifex.com/projects/p/django-" +"photologue/language/pt/)\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "" +"Separe as tags com espaços, use aspas em volta de tags com mais de uma " +"palavra" + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "" +"Django-tagging não foi encontrado, tags serão tratadas como texto simples" + +#: models.py:115 +msgid "Very Low" +msgstr "Muito Baixa" + +#: models.py:116 +msgid "Low" +msgstr "Baixa" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Média-Baixa" + +#: models.py:118 +msgid "Medium" +msgstr "Média" + +#: models.py:119 +msgid "Medium-High" +msgstr "Média-Alta" + +#: models.py:120 +msgid "High" +msgstr "Alta" + +#: models.py:121 +msgid "Very High" +msgstr "Muito Alta" + +#: models.py:126 +msgid "Top" +msgstr "Cima" + +#: models.py:127 +msgid "Right" +msgstr "Direita" + +#: models.py:128 +msgid "Bottom" +msgstr "Baixo" + +#: models.py:129 +msgid "Left" +msgstr "Esquerda" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Centro (Padrão)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Inverter da direita para a esquerda" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Inverter de cima para baixo" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Rotacionar 90 graus no sentido anti-horário" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "Rotacionar 90 graus no sentido horário" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "Rotacionar 180 graus" + +#: models.py:142 +msgid "Tile" +msgstr "Título" + +#: models.py:143 +msgid "Scale" +msgstr "Escala" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" +"Encadeie multiplos filtros usando o seguinte padrão \"FILTRO_UM->FILTRO_DOIS-" +">FILTRO_TRÊS\". Os filtors serão aplicados na ordem em que foram encadeados. " +"Os seguintes filtros estão disponíveis: %s." + +#: models.py:159 +msgid "date published" +msgstr "data de publicação" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "título" + +#: models.py:164 +msgid "title slug" +msgstr "slug do título" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "Um \"slug\" é um título único compatível com uma URL." + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "descrição" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "é publico" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Galerias públicas serão mostradas nas views padrões." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "fotos" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "tags" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "Galeria" + +#: models.py:188 +msgid "galleries" +msgstr "Galerias" + +#: models.py:225 +msgid "count" +msgstr "contagem" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "arquivo contendo as imagens (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "" +"Selecione um arquivo .zip contendo imagens para realizar o upload em uma " +"nova Galeria" + +#: models.py:252 +#, fuzzy +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" +"Todas as fotos desta galeria terão o mesmo título da mesma acrescido de um " +"número sequencial." + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "legenda" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "A legenda será adicionada para todas as fotos" + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "Uma descrição desta galeria" + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" +"Desmarque esta opção para tornar a galeria, incluindo suas fotos, não " +"pública." + +#: models.py:276 +msgid "gallery upload" +msgstr "Upload de galeria" + +#: models.py:277 +msgid "gallery uploads" +msgstr "Upload de galerias" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "imagem" + +#: models.py:395 +msgid "date taken" +msgstr "data em que a foto foi tirada" + +#: models.py:399 +msgid "view count" +msgstr "" + +#: models.py:402 +msgid "crop from" +msgstr "cortar" + +#: models.py:411 +msgid "effect" +msgstr "efeito" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Um tamanho para a foto do \"admin_thumbnail\" ainda não foi definido." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Thumbnail" + +#: models.py:649 +msgid "slug" +msgstr "slug" + +#: models.py:654 +msgid "date added" +msgstr "data que foi adicionado(a)" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "Fotos públicas serão mostradas nas views padrões." + +#: models.py:668 +msgid "photo" +msgstr "foto" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "nome" + +#: models.py:801 +msgid "rotate or flip" +msgstr "rotacionar ou inverter" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "cor" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" +"O valor 0.0 deixará a imagem em preto e branco, o fator 1.0 não alterará a " +"mesma.A factor of 0.0 gives a black and white image, a factor of 1.0 gives " +"the original image." + +#: models.py:808 +msgid "brightness" +msgstr "brilho" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" +"O valor 0.0 deixará a imagem totalmente preta, o valor 1.0 não alterará a " +"mesma." + +#: models.py:811 +msgid "contrast" +msgstr "contraste" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "" +"O valor 0.0 deixará a imagem totalmente cinza, o valor 1.0 não alterará a " +"mesma." + +#: models.py:814 +msgid "sharpness" +msgstr "nitidez" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" +"O valor 0.0 deixará a imagem embaçada, o valor 1.0 não alterará a mesma." + +#: models.py:817 +msgid "filters" +msgstr "filtros" + +#: models.py:821 +msgid "size" +msgstr "tamanho" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"Valor entre 0 e 1. O reflexo será proporcional a altura da imagem. O valor " +"0.0 não produzirá um reflexo e o valor 1.0 produzirá um reflexo com a mesma " +"altura da imagem original." + +#: models.py:824 +msgid "strength" +msgstr "força" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "O valor inicial da opacidade do gradiente de reflexão." + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" +"A cor de fundo do gradiente de reflexão. Ajuste de acordo com a cor de fundo " +"de sua página." + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "efeito de foto" + +#: models.py:834 +msgid "photo effects" +msgstr "efeitos de foto" + +#: models.py:865 +msgid "style" +msgstr "estilo" + +#: models.py:869 +msgid "opacity" +msgstr "opacidade" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "A opacidade da sobre-imagem (overlay)" + +#: models.py:874 +msgid "watermark" +msgstr "marca d'água" + +#: models.py:875 +msgid "watermarks" +msgstr "marcas d'água" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"O nome do tamanho da foto somente poderá conter letras, números e " +"underscores. Exemplos: \"thumbnail\", \"tela\", \"pequeno\", \"grande\"." + +#: models.py:898 +msgid "width" +msgstr "largura" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" +"Se o valor da largura for \"0\", a imagem será redimensionada de acordo com " +"a altura informada" + +#: models.py:901 +msgid "height" +msgstr "altura" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" +"Se o valor da altura for \"0\", a imagem será redimensionada de acordo com a " +"largura informada" + +#: models.py:904 +msgid "quality" +msgstr "qualidade" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "qualidade da imagem JPEG" + +#: models.py:908 +msgid "upscale images?" +msgstr "Aumentar a dimensão das imagens?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" +"Se selecionado, a imagem terá sua dimensão aumentada. Imagens cortadas serão " +"redimensionadas independentemente desta configuração." + +#: models.py:911 +msgid "crop to fit?" +msgstr "cortar para conformar?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"Se selecionado, a imagem será redimensionada e cortada para se conformar de " +"acordo com as dimensões fornecidas." + +#: models.py:914 +msgid "pre-cache?" +msgstr "pré-cachear?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" +"Se selecionado, o tamanho da foto será pré-cacheado logo após sua inclusão." + +#: models.py:917 +msgid "increment view count?" +msgstr "Incrementar o contador de visualizações?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"Se selecionado, o \"view_count\" desta imagem será incrementado quando o " +"tamanho da mesma for mostrado." + +#: models.py:929 +msgid "watermark image" +msgstr "imagem para marca d'água" + +#: models.py:933 +msgid "photo size" +msgstr "tamanho da foto" + +#: models.py:934 +msgid "photo sizes" +msgstr "tamanhos das fotos" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "" diff --git a/photologue/locale/pt_BR/LC_MESSAGES/django.mo b/photologue/locale/pt_BR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..87ea062ee7919b08ffdb6d93abbc4a081cefc6c6 GIT binary patch literal 8639 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 GsQwod)Y-KF literal 0 HcmV?d00001 diff --git a/photologue/locale/pt_BR/LC_MESSAGES/django.po b/photologue/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 00000000..94eeb4e4 --- /dev/null +++ b/photologue/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,637 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# David Kwast , 2009 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-25 09:56+0000\n" +"PO-Revision-Date: 2013-11-20 11:06+0000\n" +"Last-Translator: richardbarran \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/" +"django-photologue/language/pt_BR/)\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "" +"Separe as tags com espaços, use aspas em volta de tags com mais de uma " +"palavra" + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "" +"Django-tagging não foi encontrado, tags serão tratadas como texto simples" + +#: models.py:115 +msgid "Very Low" +msgstr "Muito Baixa" + +#: models.py:116 +msgid "Low" +msgstr "Baixa" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Média-Baixa" + +#: models.py:118 +msgid "Medium" +msgstr "Média" + +#: models.py:119 +msgid "Medium-High" +msgstr "Média-Alta" + +#: models.py:120 +msgid "High" +msgstr "Alta" + +#: models.py:121 +msgid "Very High" +msgstr "Muito Alta" + +#: models.py:126 +msgid "Top" +msgstr "Cima" + +#: models.py:127 +msgid "Right" +msgstr "Direita" + +#: models.py:128 +msgid "Bottom" +msgstr "Baixo" + +#: models.py:129 +msgid "Left" +msgstr "Esquerda" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Centro (Padrão)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Inverter da direita para a esquerda" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Inverter de cima para baixo" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Rotacionar 90 graus no sentido anti-horário" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "Rotacionar 90 graus no sentido horário" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "Rotacionar 180 graus" + +#: models.py:142 +msgid "Tile" +msgstr "Título" + +#: models.py:143 +msgid "Scale" +msgstr "Escala" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" +"Encadeie multiplos filtros usando o seguinte padrão \"FILTRO_UM->FILTRO_DOIS-" +">FILTRO_TRÊS\". Os filtors serão aplicados na ordem em que foram encadeados. " +"Os seguintes filtros estão disponíveis: %s." + +#: models.py:159 +msgid "date published" +msgstr "data de publicação" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "título" + +#: models.py:164 +msgid "title slug" +msgstr "slug do título" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "Um \"slug\" é um título único compatível com uma URL." + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "descrição" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "é publico" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Galerias públicas serão mostradas nas views padrões." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "fotos" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "tags" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "Galeria" + +#: models.py:188 +msgid "galleries" +msgstr "Galerias" + +#: models.py:225 +msgid "count" +msgstr "contagem" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "arquivo contendo as imagens (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "" +"Selecione um arquivo .zip contendo imagens para realizar o upload em uma " +"nova Galeria" + +#: models.py:252 +#, fuzzy +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" +"Todas as fotos desta galeria terão o mesmo título da mesma acrescido de um " +"número sequencial." + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "legenda" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "A legenda será adicionada para todas as fotos" + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "Uma descrição desta galeria" + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" +"Desmarque esta opção para tornar a galeria, incluindo suas fotos, não " +"pública." + +#: models.py:276 +msgid "gallery upload" +msgstr "Upload de galeria" + +#: models.py:277 +msgid "gallery uploads" +msgstr "Upload de galerias" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "imagem" + +#: models.py:395 +msgid "date taken" +msgstr "data em que a foto foi tirada" + +#: models.py:399 +msgid "view count" +msgstr "" + +#: models.py:402 +msgid "crop from" +msgstr "cortar" + +#: models.py:411 +msgid "effect" +msgstr "efeito" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Um tamanho para a foto do \"admin_thumbnail\" ainda não foi definido." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Thumbnail" + +#: models.py:649 +msgid "slug" +msgstr "slug" + +#: models.py:654 +msgid "date added" +msgstr "data que foi adicionado(a)" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "Fotos públicas serão mostradas nas views padrões." + +#: models.py:668 +msgid "photo" +msgstr "foto" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "nome" + +#: models.py:801 +msgid "rotate or flip" +msgstr "rotacionar ou inverter" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "cor" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" +"O valor 0.0 deixará a imagem em preto e branco, o fator 1.0 não alterará a " +"mesma.A factor of 0.0 gives a black and white image, a factor of 1.0 gives " +"the original image." + +#: models.py:808 +msgid "brightness" +msgstr "brilho" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" +"O valor 0.0 deixará a imagem totalmente preta, o valor 1.0 não alterará a " +"mesma." + +#: models.py:811 +msgid "contrast" +msgstr "contraste" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "" +"O valor 0.0 deixará a imagem totalmente cinza, o valor 1.0 não alterará a " +"mesma." + +#: models.py:814 +msgid "sharpness" +msgstr "nitidez" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" +"O valor 0.0 deixará a imagem embaçada, o valor 1.0 não alterará a mesma." + +#: models.py:817 +msgid "filters" +msgstr "filtros" + +#: models.py:821 +msgid "size" +msgstr "tamanho" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"Valor entre 0 e 1. O reflexo será proporcional a altura da imagem. O valor " +"0.0 não produzirá um reflexo e o valor 1.0 produzirá um reflexo com a mesma " +"altura da imagem original." + +#: models.py:824 +msgid "strength" +msgstr "força" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "O valor inicial da opacidade do gradiente de reflexão." + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" +"A cor de fundo do gradiente de reflexão. Ajuste de acordo com a cor de fundo " +"de sua página." + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "efeito de foto" + +#: models.py:834 +msgid "photo effects" +msgstr "efeitos de foto" + +#: models.py:865 +msgid "style" +msgstr "estilo" + +#: models.py:869 +msgid "opacity" +msgstr "opacidade" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "A opacidade da sobre-imagem (overlay)" + +#: models.py:874 +msgid "watermark" +msgstr "marca d'água" + +#: models.py:875 +msgid "watermarks" +msgstr "marcas d'água" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"O nome do tamanho da foto somente poderá conter letras, números e " +"underscores. Exemplos: \"thumbnail\", \"tela\", \"pequeno\", \"grande\"." + +#: models.py:898 +msgid "width" +msgstr "largura" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" +"Se o valor da largura for \"0\", a imagem será redimensionada de acordo com " +"a altura informada" + +#: models.py:901 +msgid "height" +msgstr "altura" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" +"Se o valor da altura for \"0\", a imagem será redimensionada de acordo com a " +"largura informada" + +#: models.py:904 +msgid "quality" +msgstr "qualidade" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "qualidade da imagem JPEG" + +#: models.py:908 +msgid "upscale images?" +msgstr "Aumentar a dimensão das imagens?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" +"Se selecionado, a imagem terá sua dimensão aumentada. Imagens cortadas serão " +"redimensionadas independentemente desta configuração." + +#: models.py:911 +msgid "crop to fit?" +msgstr "cortar para conformar?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"Se selecionado, a imagem será redimensionada e cortada para se conformar de " +"acordo com as dimensões fornecidas." + +#: models.py:914 +msgid "pre-cache?" +msgstr "pré-cachear?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" +"Se selecionado, o tamanho da foto será pré-cacheado logo após sua inclusão." + +#: models.py:917 +msgid "increment view count?" +msgstr "Incrementar o contador de visualizações?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"Se selecionado, o \"view_count\" desta imagem será incrementado quando o " +"tamanho da mesma for mostrado." + +#: models.py:929 +msgid "watermark image" +msgstr "imagem para marca d'água" + +#: models.py:933 +msgid "photo size" +msgstr "tamanho da foto" + +#: models.py:934 +msgid "photo sizes" +msgstr "tamanhos das fotos" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "" diff --git a/photologue/locale/ru/LC_MESSAGES/django.mo b/photologue/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..1cf3181c5b844b4d36eceae06dd35872174516ce GIT binary patch literal 11474 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 wG!Nrf^+3nS_sZz7&6SM&\n" +"Language-Team: Russian (http://www.transifex.com/projects/p/django-" +"photologue/language/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "Разделяйте тэги пробелами, а многословные теги ставьте в кавычки." + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "" +"Django-tagging не было найдено, поэтому тэги будут обрабатываться, как " +"простой текст." + +#: models.py:115 +msgid "Very Low" +msgstr "Очень низкое" + +#: models.py:116 +msgid "Low" +msgstr "Низкое" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Чуть хуже среднего" + +#: models.py:118 +msgid "Medium" +msgstr "Среднее" + +#: models.py:119 +msgid "Medium-High" +msgstr "Чуть лучше среднего" + +#: models.py:120 +msgid "High" +msgstr "Высокое" + +#: models.py:121 +msgid "Very High" +msgstr "Очень высокое" + +#: models.py:126 +msgid "Top" +msgstr "Верхняя сторона" + +#: models.py:127 +msgid "Right" +msgstr "Правая сторона" + +#: models.py:128 +msgid "Bottom" +msgstr "Нижняя сторона" + +#: models.py:129 +msgid "Left" +msgstr "Левая сторона" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Центр (По-умолчанию)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Зеркально отобразить слева направо" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Зеркально отобразить сверху вниз" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Повернуть на 90 градусов против часовой стрелке" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "Повернуть на 90 градусов по часовой стрелке" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "Повернуть на 180 градусов" + +#: models.py:142 +msgid "Tile" +msgstr "Разместить мозайкой" + +#: models.py:143 +msgid "Scale" +msgstr "Масштабировать" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" +"Цепочка фильтров для изображений (\"ФИЛЬТР_1->ФИЛЬТР_2->ФИЛЬТР_3\"). Фильтры " +"будут применены по порядку. Доступны следующие фильтры: %s." + +#: models.py:159 +msgid "date published" +msgstr "дата публикации" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "название" + +#: models.py:164 +msgid "title slug" +msgstr "слаг название" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "" +"\"слаг\" - это уникальное читаемое название для объекта в адресной строке." + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "описание" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "публично" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Публичные галереи будут отображены в представлениях по-умолчанию." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "фотографии" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "тэги" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "галерея" + +#: models.py:188 +msgid "galleries" +msgstr "галереи" + +#: models.py:225 +msgid "count" +msgstr "количество" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "файл изображения (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "Выберите .zip файл изображений для загрузки в новую галерею." + +#: models.py:252 +#, fuzzy +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" +"Всем фотографиям в галерее получат название, составленное из названия " +"галереи + последовательное число." + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "заголовок" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "Заголовок будет добавлен ко всем фотографиям." + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "Описание для этой галереи." + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" +"Снимите эту галку, чтобы сделать загруженную галерею и включенные в нее " +"фотографии приватными." + +#: models.py:276 +msgid "gallery upload" +msgstr "загрузка в галерею" + +#: models.py:277 +msgid "gallery uploads" +msgstr "загрузки в галерею" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "изображение" + +#: models.py:395 +msgid "date taken" +msgstr "дата наложения" + +#: models.py:399 +msgid "view count" +msgstr "" + +#: models.py:402 +msgid "crop from" +msgstr "обрезанный из" + +#: models.py:411 +msgid "effect" +msgstr "эффект" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Размер миниатюры \"admin_thumbnail\" не определен." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Миниатюра" + +#: models.py:649 +msgid "slug" +msgstr "слаг" + +#: models.py:654 +msgid "date added" +msgstr "дата добавления" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "" +"Публичные фотографии будут отображены в используемых представлениях по " +"умолчанию." + +#: models.py:668 +msgid "photo" +msgstr "фотография" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "имя" + +#: models.py:801 +msgid "rotate or flip" +msgstr "повернуть или зеркально отобразить" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "цвет" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "" +"Значение коэффициента 0.0 дает черно-белое изображение, а значение " +"коэффициента 1.0 дает оригинальное изображение." + +#: models.py:808 +msgid "brightness" +msgstr "яркость" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Значение коэффициента 0.0 дает черное изображение, а значение коэффициента " +"1.0 дает оригинальное изображение." + +#: models.py:811 +msgid "contrast" +msgstr "контраст" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Значение коэффициента 0.0 дает сплошное серое изображение, а значение " +"коэффициента 1.0 дает оригинальное изображение." + +#: models.py:814 +msgid "sharpness" +msgstr "резкость" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "" +"Значение коэффициента 0.0 дает расплывчатое изображение, а значение " +"коэффициента 1.0 дает оригинальное изображение." + +#: models.py:817 +msgid "filters" +msgstr "фильтры" + +#: models.py:821 +msgid "size" +msgstr "размер" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"Высота отражения как процент от оригинального изображения. Значение " +"коэффициента 0.0 не добавляет отображения, а значение коэффициента 1.0 " +"добавляет отражение равное высоте оригинального изображения." + +#: models.py:824 +msgid "strength" +msgstr "сила" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "Начальная непрозрачность градиента отражения." + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" +"Цвет фона градиента отражения. Отметьте это для соответствия цвету фона " +"Вашей страницы." + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "фотоэффект" + +#: models.py:834 +msgid "photo effects" +msgstr "фотоэффекты" + +#: models.py:865 +msgid "style" +msgstr "стиль" + +#: models.py:869 +msgid "opacity" +msgstr "непрозрачность" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "Непрозрачность подложки." + +#: models.py:874 +msgid "watermark" +msgstr "водяной знак" + +#: models.py:875 +msgid "watermarks" +msgstr "водяные знаки" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"Название размера фотографии должно содержать только буквы, числа и символы " +"подчеркивания. Примеры: \"thumbnail\", \"display\", \"small\", " +"\"main_page_widget\"." + +#: models.py:898 +msgid "width" +msgstr "ширина" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" +"Если ширина выставлена в \"0\", то изображение будет мастштабировано по " +"высоте." + +#: models.py:901 +msgid "height" +msgstr "высота" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" +"Если высота выставлена в \"0\", то изображение будет мастштабировано по " +"ширине" + +#: models.py:904 +msgid "quality" +msgstr "качество" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "качество JPEG изображения." + +#: models.py:908 +msgid "upscale images?" +msgstr "увеличивать изображения?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" +"Если выбранно, то изображение будет масштабировано в случае необходимости, " +"чтобы соответствовать габаритам. Обрезанные размеры будут увеличены в " +"масштабе независимо от этой настройки." + +#: models.py:911 +msgid "crop to fit?" +msgstr "обрезать?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"Если выбранно, то изображение будет масштабировано и обрезано, чтобы " +"подходить по габаритам." + +#: models.py:914 +msgid "pre-cache?" +msgstr "кэшировать?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" +"Если выбранно, то размер фотографии будет закэширован при добавлении " +"фотографий" + +#: models.py:917 +msgid "increment view count?" +msgstr "увеличивать счетчик просмотров?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"Если выбрано, то \"view_count\" изображения будет увеличено когда " +"показывается этот размер фотографии." + +#: models.py:929 +msgid "watermark image" +msgstr "изображение водяного знака" + +#: models.py:933 +msgid "photo size" +msgstr "размер фотографии" + +#: models.py:934 +msgid "photo sizes" +msgstr "размеры фотографий" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "" diff --git a/photologue/locale/sk/LC_MESSAGES/django.mo b/photologue/locale/sk/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..1de0128cc713a250ed3034d09d3f7473deef807b GIT binary patch literal 13407 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 literal 0 HcmV?d00001 diff --git a/photologue/locale/sk/LC_MESSAGES/django.po b/photologue/locale/sk/LC_MESSAGES/django.po new file mode 100644 index 00000000..7370541c --- /dev/null +++ b/photologue/locale/sk/LC_MESSAGES/django.po @@ -0,0 +1,643 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Juraj Bubniak , 2012-2013 +# saboter , 2014 +# saboter , 2014 +# saboter , 2014 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-25 09:56+0000\n" +"PO-Revision-Date: 2014-07-26 10:15+0000\n" +"Last-Translator: saboter \n" +"Language-Team: Slovak (http://www.transifex.com/projects/p/django-photologue/" +"language/sk/)\n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "Nasledujúca fotografia nepatrí tej istej stránke (stránkam)" +msgstr[1] "Nasledujúce fotografie nepatria tej istej stránke (stránkam)" +msgstr[2] "Nasledujúce fotografie nepatria tej istej stránke (stránkam)" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "Galéria bola úspešne pridaná na %(site)s" +msgstr[1] "Galérie boli úspešne pridané na %(site)s" +msgstr[2] "Galérie boli úspešne pridané na %(site)s" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "Pridať označené galérie z aktuálnej stránky" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "Galéria bola úspešne odobratá zo %(site)s" +msgstr[1] "Označené galérie boli úspešne odobrané zo %(site)s" +msgstr[2] "Označené galérie boli úspešne odobrané zo %(site)s" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "Odobrať označené galérie z aktuálnej stránky" + +#: admin.py:106 +#, fuzzy, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "Všetky fotografie z galérie %(galleries)s boli úspešne" +msgstr[1] "Všetky fotografie z galérií %(galleries)s boli úspešne" +msgstr[2] "Všetky fotografie z galérií %(galleries)s boli úspešne" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "Pridať všetky fotografie z označených galérií do aktuálnej stránky" + +#: admin.py:124 +#, fuzzy, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "Všetky fotografie z galérie %(galleries)s boli úspešne" +msgstr[1] "Všetky fotografie z galérií %(galleries)s boli úspešne" +msgstr[2] "Všetky fotografie z galérií %(galleries)s boli úspešne" + +#: admin.py:135 +#, fuzzy +msgid "Remove all photos in selected galleries from the current site" +msgstr "Odobrať všetky fotografie z označených galérií z aktuálnej stránky" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "Fotografia bola úspešne pridaná na %(site)s" +msgstr[1] "Označené fotografie boli úspešne pridané na %(site)s" +msgstr[2] "Označené fotografie boli úspešne pridané na %(site)s" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "Pridať označené fotografie na aktuálnu stránku" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "Fotografia bola úspešne odobratá zo %(site)s" +msgstr[1] "Označené fotografie boli úspešne odobraté zo %(site)s" +msgstr[2] "Označené fotografie boli úspešne odobraté zo %(site)s" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr " Odobrať označené fotografie z aktuálnej stránky" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "Oddeľte tagy medzerami, vložte úvodzovky okolo viac-slovných tagov." + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "" +"Aplikácia Django-tagging sa nenašla, s tagmi sa bude zaobchádzať ako s " +"obyčajným textom." + +#: models.py:115 +msgid "Very Low" +msgstr "Veľmi Nízka" + +#: models.py:116 +msgid "Low" +msgstr "Nízka" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Stredne-Nízka" + +#: models.py:118 +msgid "Medium" +msgstr "Stredná" + +#: models.py:119 +msgid "Medium-High" +msgstr "Stredne-Vysoká" + +#: models.py:120 +msgid "High" +msgstr "Vysoká" + +#: models.py:121 +msgid "Very High" +msgstr "Veľmi Vysoká" + +#: models.py:126 +msgid "Top" +msgstr "Hore" + +#: models.py:127 +msgid "Right" +msgstr "Vpravo" + +#: models.py:128 +msgid "Bottom" +msgstr "Dole" + +#: models.py:129 +msgid "Left" +msgstr "Vľavo" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Stred (Štandardne)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Prevrátiť zľava doprava" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Prevrátiť zhora nadol" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "Otočiť o 90 stupňov proti smeru hodinových ručičiek" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "Otočiť o 90 stupňov v smere hodinových ručičiek" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "Otočiť o 180 stupňov" + +#: models.py:142 +msgid "Tile" +msgstr "Dláždiť" + +#: models.py:143 +msgid "Scale" +msgstr "Dodržať mierku" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" +"Zreťazte viac filtrov pomocou nasledovného vzoru \"FILTER_JEDNA->FILTER_DVA-" +">FILTER_TRI\". Obrázkové filtre budú použité v poradí. Nasledujúce filtre sú " +"k dispozícii: %s." + +#: models.py:159 +msgid "date published" +msgstr "dátum zverejnenia" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "názov" + +#: models.py:164 +msgid "title slug" +msgstr "identifikátor názvu" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "\"Identifikátor\" je unikátny názov objektu vhodný pre použitie v URL." + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "popis" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "je verejný" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Verejné galérie budú zobrazené v štandardných zobrazeniach." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "fotografie" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "tagy" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "stránky" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "galéria" + +#: models.py:188 +msgid "galleries" +msgstr "galérie" + +#: models.py:225 +msgid "count" +msgstr "počet" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "súbor s obrázkami (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "Vyberte .zip súbor s obrázkami, ktorý chcete nahrať do novej Galérie." + +#: models.py:252 +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" +"Všetky nahrané fotografie budú mať meno vytvorené z tohoto názvu a zo " +"sekvenčného čísla." + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" +"Vyberte galériu do ktorej chcete pridať tieto obrázky. Pre vytvorenie novej " +"galérie so zadaným názvom ponechajte toto pole prázdne." + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "titulok" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "Titulok bude pridaný do všetkých fotografií." + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "Popis tejto galérie." + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "Odškrtnite, aby odovzdané galérie a zahrnuté fotografie boli súkromné." + +#: models.py:276 +msgid "gallery upload" +msgstr "odovzdanie galérie" + +#: models.py:277 +msgid "gallery uploads" +msgstr "odovzdania galérie" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "Galéria s týmto názvom už existuje." + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "Vyberte existujúcu galériu, alebo vložte meno pre novú galériu." + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" +"Ignorujem súbor \"{filename}\" nakoľko je v podadresári, všetky obrázky by " +"mali byť priamo v zip archíve bez vnorenej adresárovej štruktúry." + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" +"Fotografia \"%(filename)s\" s identifikátorom \"{1}\" nebola vytvorená. " +"Fotografia s takým istým identifikátorom už existuje." + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "Nepodarilo sa spracovať súbor \"{0}\" v .zip archíve." + +#: models.py:392 models.py:863 +msgid "image" +msgstr "obrázok" + +#: models.py:395 +msgid "date taken" +msgstr "dátum odfotenia" + +#: models.py:399 +msgid "view count" +msgstr "počet zobrazení" + +#: models.py:402 +msgid "crop from" +msgstr "orezať od" + +#: models.py:411 +msgid "effect" +msgstr "efekt" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Veľkosť fotografie \"admin_thumbnail\" nebola definovaná." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Náhľad" + +#: models.py:649 +msgid "slug" +msgstr "identifikátor" + +#: models.py:654 +msgid "date added" +msgstr "dátum pridania" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "Verejné fotografie budú zobrazené v štandardných zobrazeniach." + +#: models.py:668 +msgid "photo" +msgstr "fotografia" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "meno" + +#: models.py:801 +msgid "rotate or flip" +msgstr "otočiť alebo prevrátiť" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "farba" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "Faktor 0.0 dáva čiernobiely obrázok, faktor 1.0 dáva pôvodný obrázok." + +#: models.py:808 +msgid "brightness" +msgstr "jas" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "Faktor 0.0 dáva čierny obrázok, faktor 1.0 dáva pôvodný obrázok." + +#: models.py:811 +msgid "contrast" +msgstr "kontrast" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "Faktor 0.0 dáva šedý obrázok, faktor 1.0 dáva pôvodný obrázok." + +#: models.py:814 +msgid "sharpness" +msgstr "ostrosť" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "Faktor 0.0 dáva rozmazaný obrázok, faktor 1.0 dáva pôvodný obrázok." + +#: models.py:817 +msgid "filters" +msgstr "filtre" + +#: models.py:821 +msgid "size" +msgstr "veľkosť" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"Výška odrazu v percentách pôvodného obrázku. Faktor 0.0 nepridáva žiadny " +"odraz, faktor 1.0 pridáva odraz rovný výśke pôvodného obrázku." + +#: models.py:824 +msgid "strength" +msgstr "intenzita" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "Počiatočná presvitnosť odrazového gradientu." + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" +"Farba pozadia odrazového gradientu. Túto položku nastavte tak, aby sa " +"zhodovala s farbou pozadia vašej stránky." + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "efekt fotografie" + +#: models.py:834 +msgid "photo effects" +msgstr "efekty fotografie" + +#: models.py:865 +msgid "style" +msgstr "štýl" + +#: models.py:869 +msgid "opacity" +msgstr "priesvitnosť" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "Priesvitnosť prekrytia." + +#: models.py:874 +msgid "watermark" +msgstr "vodoznak" + +#: models.py:875 +msgid "watermarks" +msgstr "vodoznaky" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"Názov veľkosti fotografie by mal obsahovať len písmená, čísla a podčiarky. " +"Príklady: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." + +#: models.py:898 +msgid "width" +msgstr "šírka" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "" +"Ak je šírka nastavená na \"0\" obrázok bude podľa mierky upravený na zadanú " +"výšku." + +#: models.py:901 +msgid "height" +msgstr "výška" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "" +"Ak je výška nastavená na \"0\" obrázok bude podľa mierky upravený na zadanú " +"šírku" + +#: models.py:904 +msgid "quality" +msgstr "kvalita" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "JPEG kvalita obrázku." + +#: models.py:908 +msgid "upscale images?" +msgstr "prispôsobiť obzázky?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "" +"Ak je táto položka vybratá a je to potrebné, obrázok bude prispôsobený tak, " +"aby sa zmestil do zadaných rozmerov." + +#: models.py:911 +msgid "crop to fit?" +msgstr "orezať ak je to potrebné ?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"Ak je táto položka vybratá, obrázok bude upravený a orezaný, aby sa zmestil " +"do zadaných rozmerov." + +#: models.py:914 +msgid "pre-cache?" +msgstr "pred-generovať ?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "" +"Ak je táto položka vybratá, veľkosť fotografie bude pred-generovaná počas " +"pridávania fotografií." + +#: models.py:917 +msgid "increment view count?" +msgstr "zvýšiť počet zobrazení?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"Ak je táto položka vybratá, \"view_count\" obrázku bude zvýšený, keď sa " +"zobrazí veľkosť tohto obrázku." + +#: models.py:929 +msgid "watermark image" +msgstr "použiť vodoznak na obrázok" + +#: models.py:933 +msgid "photo size" +msgstr "veľkosť fotografie" + +#: models.py:934 +msgid "photo sizes" +msgstr "veľkosti fotografie" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "Fotky môžete orezať len vtedy, ak je nastavená šírka a výška." + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "Posledné Galérie" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "Zverejnené" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "Neboli nájdené žiadne galérie" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "Zobraziť všetky galérie" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "Všetky Galérie" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "Predchádzajúci" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" +"\n" +"\t\t\t\t stránka %(page_number)s z %(total_pages)s\n" +"\t\t\t\t" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "Nasledujúci" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "Táto fotka sa nachádza v nasledujúcich galériách" diff --git a/photologue/locale/tr/LC_MESSAGES/django.mo b/photologue/locale/tr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..a2adc8d58dca81d95f4c270e9e14d228b29e8179 GIT binary patch literal 7435 zcmb`LZHy$xS;s3OCa?q&ft5WxZ ze+k|yFMdj?r-1i?kAauLb?_x{1H9>{mAVIv!Jh;$ zH~1FDr@)io8YpzX0R9&EFQD*P{ESk^z`q4gfj7QQsb2s;2Fm^n{0XoG<@_PYQuQei z66!a>-vECHJPh9avr4Ui=Rmpg=Ro1>S@4&@7r@)VtM&YML0SKA-~-@?eom=B1tU<_ z-}-i?xSCo4g`eY~@N*h`6g*SUKL;W*_4}ak^~WG0R$m8&k3XyDuh!$2L81G1Agrrz zfwJ#kL5^1cRgZ5#$a3FzfO7wvL7{saDEsfM$M=A;?@Lk|1 zK-vF!Q110SD0II9%K8^T;pi3O$duj&ksP^e;NGho0R%h@IJvl02|;-;3D{+;4=7u8!LNx5)^%Y4!j-wBFLZm20tgkm%(2I--Xa_0T)2I=Of_5 z;8{@Y_{-oL_wKI`2+U8mqDTb51_37XHf3(9Z>Ay-$B{;0}z(g4LFh5!z~~xQVXEy z^?p#+KL&~(&w)bs=^AZ4pMtXf5-9im3@Chj36%5y0OTn3M_}-4P}YC9p8p{z{QXZo zek(yy?DuV;@O2X?{N4e|zPmxu?{QG;4dwbzcQVj^6;~oR{kNe-DaZe!HIk9w__Xgt1}P;jWK^B0J&Z1GEz~c~)o=!xw4C zX!0DO$$f;^hiRhA+i4=Z4caDco+gjTU7oYFr)dXizf6;7f%ajV-0cC{X`0y0_z~HN zU5e~KL~GFG5g(LCWIKMuza&<2weUQ`uh`sU)iC_7)qT0U=n-`V`w?FqKX0aUKkcsZ ziy0J|eq?5RxbB|;#s5SHAEdpX_CA{ELemb>#*gR^_YHaNPVnw};yBo(-9Zyyl4pq~ zb|lX#?Ofb>WKG>Tc?_Np#w}Xxl}TZ5^Apy~_%h^0upsJ_JsgIJSN$(_Pap z*uuv1v!p>FBM#E39?{)3XaqOqVZDmKS}iQ}22%F>$r>^$7nM$(7#Q z&X143JdIsP_q-kc2s9HtZ#n~)TqyeGpp_UG&+Dw87OBqNw$*);>m)67%i09BbX{UQ zP4!S(6zM=6GnIuCbtzvp@pJrJ_ zrt3IumQ=?LY?5QsNCm!LpJ173*VTz_+dMZOZ%Ot4MN}WF4;Rf%g;-|w)x7N)--#hM zaVjKIpoG`p=Z;*@UvhTqLL1!_^Al0Ir0p$t5ov7oF^u4#GggDFJ1$3ML$Q`?@5r<~t%m5SVr)7-B)1(m7OcUZ+j6AK+7j%L%(Fx%QyQbStz0I5Y z#AP$c(7}qHpL*Pap0DLKPd6XnKhhaM_d-S#yTILhwwQ0K^|BSaw(f;s=w`G$k+&8% z!R&BW@i#3B#Ng_UL9#t>vi{USUT^E!;9+Oe0$3MKLvz5u@5nGj%S(smP1LMWH`15#r*IO04)>WlO_gs(5x>N)Vs5lgztI2)U`A zAph#%7NI9j(F)-=A*QHyl?_xojZ@EWQh1XWbWppJxTw3Hq!D^BLL^&N9Z_CL8&x+G z^UjF^)v$osM9owK%67YGM`0!6XKLaHb#FMv`g+$5b5)5}1?#GQ^UCB7i1i&*lh79Y z2Iq$PRV6ViIGz&ESGD+65K{H4YsSK>dXU#s5{_rO^=n`p^Hx$NbuhR@D}A_5yu7l+I-a>TY^Sm5 zO_IlkVsC{!-$ojpmhrsQAE}2A7*A=^z(jD8W;<<`(f#aAdL3L>=`U()t&RjY_U^SCqa+l#*1-HZL#o+2Pd>wbm8aDoIZ16 zDkZARxnr0;;i9oQ%n*T;D~q9WIiiJo((Tc6nZDB(oQ?1;uU?k<%+rW zxb!A&oJ{?IRFPz1m>)fKghEJWjvh$#{d)P}kvTQL5o+v~^908{p{^NSAqSK`)}1sj zN^P(1U_M$Fw9M6=cz-u4_IEvHT&Zy&>s`G?Rum@L-yOteVD!*z@9#3&ZYrs>b2l`7 z$~;~NTKLe#1uZ3Y>MxG#=!^TinrP&pKC=h9Z)7zUJjX?En0jQm2ZgVDLpvUVi&xgV zT`6@(FUF%QqrD)Cu>g{R8SL*~-Ql|+E~Eu<=wh@t;DZHsAoFM&#a8OGsE`|csvIXAG-R>>|AsloUHGa-r%{ z#r13=$2t~Q2Ul{L+_9-^Lb=7l!sejX>y|-pLejQO5d@X*@9yt(usZTjZEZp5Q{u0n zy-*PsYeL8~IvR7=v!3n9Dz~~d+T(gChvY5ds%|`Gv?7K%>v@ssXfFwC6RG1wRq#i} z6^!AU`HqW5S4dI5Fm3aybZc9vOu=CQ$pXA4I11mZWAhj@G#2q|XkenD*Hl4Oz(!KJ z67s|<)bY{Y)g4r;9*4>B(>P!2UEVY%^C!jBMI%Ve4T7=frh~lr%A@GP9=(YSzVAha zVvtxh#Tm|v47_cL&YODltWV@(#N>HC9EYYL)L0)XSL=IDI#Jm!Bk7pLTtL8GbKw$8 zv2SYFQ$Yc7MX!!Pa>}Kt+XVYVNjMub9h4-LF#{(@T~A`Hg8v7B4V*<)wX8Up?x3>H zXwR!q%!XIFK~h8B!^i6_Akvd6XP1qhC8UU$)OolL0jiF*qGWvAj{P7A7me_hKt)(< zCecGAVq#oIygKX;^)VrRXs}i!B4OTbi&qjx`0_w99F$(&DI?LL6w+ea9;?SBucVQV zY|J+(E<^N6SOXa%Xfk$5Q98q>I!{s}3rIAEk#X4A-*F4q#riP2-GOApjI0+QZ-)QN z^tl*0q@pAdVPLm|cU+$`t~o(RrUUbmiY9v{=)rAMJ!*=YDN3*iUPU&<-C%{Hy+_NU zY()Gl=m^^#$S1h*q%k#mo?2A=LIO74IZk~;C&oUbgUDSI;}Oy5#cdnIO*V~P#7RC* zk@&z49ReFYgLKDU7X}zp<&}J)#DUjHiA#knqA1}a6^%<|9K?*SC=}, 2009 +msgid "" +msgstr "" +"Project-Id-Version: Photologue\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-25 09:56+0000\n" +"PO-Revision-Date: 2013-11-20 11:06+0000\n" +"Last-Translator: richardbarran \n" +"Language-Team: Turkish (http://www.transifex.com/projects/p/django-" +"photologue/language/tr/)\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: admin.py:67 +msgid "The following photo does not belong to the same site(s)" +msgid_plural "The following photos do not belong to the same site(s)" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:79 +#, python-format +msgid "The gallery has been successfully added to %(site)s" +msgid_plural "The galleries have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:86 +msgid "Add selected galleries from the current site" +msgstr "" + +#: admin.py:92 +#, python-format +msgid "The gallery has been successfully removed from %(site)s" +msgid_plural "" +"The selected galleries have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:99 +msgid "Remove selected galleries from the current site" +msgstr "" + +#: admin.py:106 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully added to %(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully added to " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:117 +msgid "Add all photos of selected galleries to the current site" +msgstr "" + +#: admin.py:124 +#, python-format +msgid "" +"All photos in gallery %(galleries)s have been successfully removed from " +"%(site)s" +msgid_plural "" +"All photos in galleries %(galleries)s have been successfully removed from " +"%(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:135 +msgid "Remove all photos in selected galleries from the current site" +msgstr "" + +#: admin.py:186 +#, python-format +msgid "The photo has been successfully added to %(site)s" +msgid_plural "The selected photos have been successfully added to %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:193 +msgid "Add selected photos to the current site" +msgstr "" + +#: admin.py:199 +#, python-format +msgid "The photo has been successfully removed from %(site)s" +msgid_plural "The selected photos have been successfully removed from %(site)s" +msgstr[0] "" +msgstr[1] "" + +#: admin.py:206 +msgid "Remove selected photos from the current site" +msgstr "" + +#: models.py:56 +msgid "Separate tags with spaces, put quotes around multiple-word tags." +msgstr "" +"Etikletleri boşuklar ile ayırın, çok kelimeli olanları tınak içine alın." + +#: models.py:67 +msgid "Django-tagging was not found, tags will be treated as plain text." +msgstr "Django-tagging buunamıyor, etiketler salt metin gibi işlem görecek." + +#: models.py:115 +msgid "Very Low" +msgstr "Çok düşük" + +#: models.py:116 +msgid "Low" +msgstr "Düşük" + +#: models.py:117 +msgid "Medium-Low" +msgstr "Orta-Düşük" + +#: models.py:118 +msgid "Medium" +msgstr "Orta" + +#: models.py:119 +msgid "Medium-High" +msgstr "Orta-Yüksek" + +#: models.py:120 +msgid "High" +msgstr "Yüksek" + +#: models.py:121 +msgid "Very High" +msgstr "Çok Yüksek" + +#: models.py:126 +msgid "Top" +msgstr "Üst" + +#: models.py:127 +msgid "Right" +msgstr "Sağ" + +#: models.py:128 +msgid "Bottom" +msgstr "Alt" + +#: models.py:129 +msgid "Left" +msgstr "Sol" + +#: models.py:130 +msgid "Center (Default)" +msgstr "Merkez (Varsayılan)" + +#: models.py:134 +msgid "Flip left to right" +msgstr "Soldan sağa ayna aksi" + +#: models.py:135 +msgid "Flip top to bottom" +msgstr "Yukardan aşağıya ayna aksi" + +#: models.py:136 +msgid "Rotate 90 degrees counter-clockwise" +msgstr "90 derece saat yönü tersine döndür" + +#: models.py:137 +msgid "Rotate 90 degrees clockwise" +msgstr "90 derece saat yönüne döndür" + +#: models.py:138 +msgid "Rotate 180 degrees" +msgstr "180 derece döndür" + +#: models.py:142 +msgid "Tile" +msgstr "Kutu-kutu, kiremit tarzı" + +#: models.py:143 +msgid "Scale" +msgstr "Ölçekle" + +#: models.py:154 +#, python-format +msgid "" +"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-" +">FILTER_THREE\". Image filters will be applied in order. The following " +"filters are available: %s." +msgstr "" + +#: models.py:159 +msgid "date published" +msgstr "yayınlama tarihi" + +#: models.py:161 models.py:250 models.py:646 +msgid "title" +msgstr "başlık" + +#: models.py:164 +msgid "title slug" +msgstr "başlık slug" + +#: models.py:166 models.py:651 +msgid "A \"slug\" is a unique URL-friendly title for an object." +msgstr "\"Slug\" bir nesne için url dostu eşsiz bir başlıktır." + +#: models.py:167 models.py:263 models.py:730 +msgid "description" +msgstr "tanım" + +#: models.py:169 models.py:266 models.py:656 +msgid "is public" +msgstr "Görünür mü?" + +#: models.py:171 +msgid "Public galleries will be displayed in the default views." +msgstr "Görülebilir galeriler varsayılan görünümlerde sergilenirler." + +#: models.py:175 models.py:669 +msgid "photos" +msgstr "fotolar" + +#: models.py:178 models.py:273 models.py:659 +msgid "tags" +msgstr "etiketler" + +#: models.py:179 models.py:660 +msgid "sites" +msgstr "" + +#: models.py:187 models.py:255 +msgid "gallery" +msgstr "galeri" + +#: models.py:188 +msgid "galleries" +msgstr "galeriler" + +#: models.py:225 +msgid "count" +msgstr "sayaç" + +#: models.py:247 +msgid "images file (.zip)" +msgstr "resimlerin dosyası (.zip)" + +#: models.py:249 +msgid "Select a .zip file of images to upload into a new Gallery." +msgstr "" +"Yeni bir galeri yüklemek için içerisinde resimlerin yer aldığı bir .zip " +"dosyası seçiniz. " + +#: models.py:252 +#, fuzzy +msgid "" +"All uploaded photos will be given a title made up of this title + a " +"sequential number." +msgstr "" +"Galerideki tüm fotolara, galeri başlığı + sıralı numaradan oluşacak bir " +"başlık verilecektir " + +#: models.py:258 +msgid "" +"Select a gallery to add these images to. Leave this empty to create a new " +"gallery from the supplied title." +msgstr "" + +#: models.py:260 models.py:652 +msgid "caption" +msgstr "alt yazı" + +#: models.py:262 +msgid "Caption will be added to all photos." +msgstr "Altyazı tüm fotolara eklenecektir." + +#: models.py:265 +msgid "A description of this Gallery." +msgstr "Bu galeri için bir tanımlama yazınız." + +#: models.py:268 +msgid "" +"Uncheck this to make the uploaded gallery and included photographs private." +msgstr "" +"Yüklenen bu galeriyi ve içerisindeki tüm fotoları özel yapmak için " +"işaretlemeyin." + +#: models.py:276 +msgid "gallery upload" +msgstr "galeri yükleme" + +#: models.py:277 +msgid "gallery uploads" +msgstr "galeri yüklemeleri" + +#: models.py:289 +msgid "A gallery with that title already exists." +msgstr "" + +#: models.py:293 +msgid "Select an existing gallery or enter a new gallery name." +msgstr "" + +#: models.py:329 +msgid "" +"Ignoring file \"{filename}\" as it is in a subfolder; all images should be " +"in the top folder of the zip." +msgstr "" + +#: models.py:349 +#, python-format +msgid "" +"Did not create photo \"%(filename)s\" with slug \"{1}\" as a photo with that " +"slug already exists." +msgstr "" + +#: models.py:375 +msgid "Could not process file \"{0}\" in the .zip archive." +msgstr "" + +#: models.py:392 models.py:863 +msgid "image" +msgstr "imaj" + +#: models.py:395 +msgid "date taken" +msgstr "çekilme tarihi" + +#: models.py:399 +msgid "view count" +msgstr "" + +#: models.py:402 +msgid "crop from" +msgstr "şuradan kes" + +#: models.py:411 +msgid "effect" +msgstr "efekt" + +#: models.py:429 +msgid "An \"admin_thumbnail\" photo size has not been defined." +msgstr "Bir \"admin_thumbnail\" foto ölçüleri tanımlanmamış." + +#: models.py:437 +msgid "Thumbnail" +msgstr "Minyatür" + +#: models.py:649 +msgid "slug" +msgstr "slug" + +#: models.py:654 +msgid "date added" +msgstr "eklenme tarihi" + +#: models.py:658 +msgid "Public photographs will be displayed in the default views." +msgstr "Görülebilir fotolar varsayılan görünümlerde sergilenirler." + +#: models.py:668 +msgid "photo" +msgstr "foto" + +#: models.py:727 models.py:889 +msgid "name" +msgstr "isim" + +#: models.py:801 +msgid "rotate or flip" +msgstr "döndür ya da ayna aksi" + +#: models.py:805 models.py:827 +msgid "color" +msgstr "renk" + +#: models.py:807 +msgid "" +"A factor of 0.0 gives a black and white image, a factor of 1.0 gives the " +"original image." +msgstr "0.0 siyah beyaz bir imaj, 1.0 orjinal imajı verir." + +#: models.py:808 +msgid "brightness" +msgstr "parlaklık" + +#: models.py:810 +msgid "" +"A factor of 0.0 gives a black image, a factor of 1.0 gives the original " +"image." +msgstr "0.0 siyah bir imaj, 1.0 orjinal imajı verir." + +#: models.py:811 +msgid "contrast" +msgstr "kontrast" + +#: models.py:813 +msgid "" +"A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original " +"image." +msgstr "0.0 katı gri bir imaj, 1.0 orjinal imajı verir." + +#: models.py:814 +msgid "sharpness" +msgstr "keskinlik" + +#: models.py:816 +msgid "" +"A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original " +"image." +msgstr "0.0 blanık bir imaj, 1.0 orjinal imajı verir." + +#: models.py:817 +msgid "filters" +msgstr "filtreler" + +#: models.py:821 +msgid "size" +msgstr "boyutlar" + +#: models.py:823 +msgid "" +"The height of the reflection as a percentage of the orignal image. A factor " +"of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the " +"height of the orignal image." +msgstr "" +"Yansımanın yüksekliği, orjinal imajın yüzdelik oranıdır. 0.0 hiç yansıma " +"vermezken, 1.0 orjinal imaj yüksekliği kadar bir yansıma sağlar." + +#: models.py:824 +msgid "strength" +msgstr "gerilim" + +#: models.py:826 +msgid "The initial opacity of the reflection gradient." +msgstr "" + +#: models.py:830 +msgid "" +"The background color of the reflection gradient. Set this to match the " +"background color of your page." +msgstr "" + +#: models.py:833 models.py:924 +msgid "photo effect" +msgstr "foto efekti" + +#: models.py:834 +msgid "photo effects" +msgstr "foto efektleri" + +#: models.py:865 +msgid "style" +msgstr "tarz" + +#: models.py:869 +msgid "opacity" +msgstr "opaklık" + +#: models.py:871 +msgid "The opacity of the overlay." +msgstr "Katmanın opaklığı." + +#: models.py:874 +msgid "watermark" +msgstr "su damga" + +#: models.py:875 +msgid "watermarks" +msgstr "su damgaları" + +#: models.py:893 +msgid "" +"Photo size name should contain only letters, numbers and underscores. " +"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"." +msgstr "" +"Foto ebat isimleri sadece hafler, rakamlar ve alt tireler içerebilir. " +"Örnekler: \"minyaturler\", \"sergi\", \"kucuk\", \"ana_sayfa_vinyeti\"." + +#: models.py:898 +msgid "width" +msgstr "genişlik" + +#: models.py:900 +msgid "" +"If width is set to \"0\" the image will be scaled to the supplied height." +msgstr "Eğer genişlik 0 verilirse, verilen yüksekliğe göre ölçeklenecek." + +#: models.py:901 +msgid "height" +msgstr "yükseklik" + +#: models.py:903 +msgid "" +"If height is set to \"0\" the image will be scaled to the supplied width" +msgstr "Eğer yükseklik 0 verilirse, verilen genişliğe göre ölçeklenecek. " + +#: models.py:904 +msgid "quality" +msgstr "kalite" + +#: models.py:907 +msgid "JPEG image quality." +msgstr "JPEG kalitesi" + +#: models.py:908 +msgid "upscale images?" +msgstr "imajı büyüt?" + +#: models.py:910 +msgid "" +"If selected the image will be scaled up if necessary to fit the supplied " +"dimensions. Cropped sizes will be upscaled regardless of this setting." +msgstr "Eğer seçilirse, imaj verilen ölçülere göre gerekli ise büyütülecek." + +#: models.py:911 +msgid "crop to fit?" +msgstr "sığdırmak için kes?" + +#: models.py:913 +msgid "" +"If selected the image will be scaled and cropped to fit the supplied " +"dimensions." +msgstr "" +"Eğer seçilirse imaj ölçeklenecek ve verilen ebatlara sığdırmak için " +"ölçeklenecek." + +#: models.py:914 +msgid "pre-cache?" +msgstr "wstępnie cachować?" + +#: models.py:916 +msgid "If selected this photo size will be pre-cached as photos are added." +msgstr "Eğer seçilirse, fotolar eklenirken, ön belleklenecek." + +#: models.py:917 +msgid "increment view count?" +msgstr "görüntüleme sayısını arttır?" + +#: models.py:919 +msgid "" +"If selected the image's \"view_count\" will be incremented when this photo " +"size is displayed." +msgstr "" +"Eğer seçilirse, imajın \"görüntülenme sayısı\", foto görüntülendikçe artacak." + +#: models.py:929 +msgid "watermark image" +msgstr "su damgası imajı" + +#: models.py:933 +msgid "photo size" +msgstr "photo ebadı" + +#: models.py:934 +msgid "photo sizes" +msgstr "photo ebadları" + +#: models.py:951 +msgid "Can only crop photos if both width and height dimensions are set." +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:5 +#: contrib/bootstrap/templates/photologue/gallery_archive.html:11 +msgid "Latest Photo Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:20 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:12 +#: contrib/bootstrap/templates/photologue/gallery_list.html:20 +#: contrib/bootstrap/templates/photologue/photo_detail.html:13 +msgid "Published" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:31 +#: contrib/bootstrap/templates/photologue/gallery_list.html:31 +msgid "No galleries were found" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_archive.html:36 +#: contrib/bootstrap/templates/photologue/gallery_detail.html:21 +msgid "View all galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:5 +#: contrib/bootstrap/templates/photologue/gallery_list.html:11 +msgid "All Galleries" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:37 +#: contrib/bootstrap/templates/photologue/gallery_list.html:39 +msgid "Previous" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:42 +#, python-format +msgid "" +"\n" +"\t\t\t\t page %(page_number)s of %(total_pages)s\n" +"\t\t\t\t" +msgstr "" + +#: contrib/bootstrap/templates/photologue/gallery_list.html:47 +#: contrib/bootstrap/templates/photologue/gallery_list.html:49 +msgid "Next" +msgstr "" + +#: contrib/bootstrap/templates/photologue/photo_detail.html:21 +msgid "This photo is found in the following galleries" +msgstr "" diff --git a/photologue/management/__init__.py b/photologue/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/photologue/management/commands/__init__.py b/photologue/management/commands/__init__.py new file mode 100644 index 00000000..3c718866 --- /dev/null +++ b/photologue/management/commands/__init__.py @@ -0,0 +1,40 @@ +from __future__ import print_function +from photologue.models import PhotoSize + + +def get_response(msg, func=int, default=None): + while True: + resp = raw_input(msg) + if not resp and default is not None: + return default + try: + return func(resp) + except: + print('Invalid input.') + + +def create_photosize(name, width=0, height=0, crop=False, pre_cache=False, increment_count=False): + try: + size = PhotoSize.objects.get(name=name) + exists = True + except PhotoSize.DoesNotExist: + size = PhotoSize(name=name) + exists = False + if exists: + msg = 'A "%s" photo size already exists. Do you want to replace it? (yes, no):' % name + if not get_response(msg, lambda inp: inp == 'yes', False): + return + print('\nWe will now define the "%s" photo size:\n' % size) + w = get_response('Width (in pixels):', lambda inp: int(inp), width) + h = get_response('Height (in pixels):', lambda inp: int(inp), height) + c = get_response('Crop to fit? (yes, no):', lambda inp: inp == 'yes', crop) + p = get_response('Pre-cache? (yes, no):', lambda inp: inp == 'yes', pre_cache) + i = get_response('Increment count? (yes, no):', lambda inp: inp == 'yes', increment_count) + size.width = w + size.height = h + size.crop = c + size.pre_cache = p + size.increment_count = i + size.save() + print('\nA "%s" photo size has been created.\n' % name) + return size diff --git a/photologue/management/commands/plcache.py b/photologue/management/commands/plcache.py new file mode 100644 index 00000000..38142db6 --- /dev/null +++ b/photologue/management/commands/plcache.py @@ -0,0 +1,46 @@ +from __future__ import print_function +from django.core.management.base import BaseCommand, CommandError +from optparse import make_option +from photologue.models import PhotoSize, ImageModel + + +class Command(BaseCommand): + option_list = BaseCommand.option_list + ( + make_option('--reset', '-r', action='store_true', dest='reset', help='Reset photo cache before generating'), + ) + + help = ('Manages Photologue cache file for the given sizes.') + args = '[sizes]' + + requires_model_validation = True + can_import_settings = True + + def handle(self, *args, **options): + return create_cache(args, options) + + +def create_cache(sizes, options): + """ + Creates the cache for the given files + """ + reset = options.get('reset', None) + + size_list = [size.strip(' ,') for size in sizes] + + if len(size_list) < 1: + sizes = PhotoSize.objects.filter(pre_cache=True) + else: + sizes = PhotoSize.objects.filter(name__in=size_list) + + if not len(sizes): + raise CommandError('No photo sizes were found.') + + print('Caching photos, this may take a while...') + + for cls in ImageModel.__subclasses__(): + for photosize in sizes: + print('Cacheing %s size images' % photosize.name) + for obj in cls.objects.all(): + if reset: + obj.remove_size(photosize) + obj.create_size(photosize) diff --git a/photologue/management/commands/plcreatesize.py b/photologue/management/commands/plcreatesize.py new file mode 100644 index 00000000..a9051b4a --- /dev/null +++ b/photologue/management/commands/plcreatesize.py @@ -0,0 +1,15 @@ +from django.core.management.base import BaseCommand +from photologue.management.commands import create_photosize + + +class Command(BaseCommand): + help = ('Creates a new Photologue photo size interactively.') + requires_model_validation = True + can_import_settings = True + + def handle(self, *args, **options): + create_size(args[0]) + + +def create_size(size): + create_photosize(size) diff --git a/photologue/management/commands/plflush.py b/photologue/management/commands/plflush.py new file mode 100644 index 00000000..400047f2 --- /dev/null +++ b/photologue/management/commands/plflush.py @@ -0,0 +1,37 @@ +from __future__ import print_function +from django.core.management.base import BaseCommand, CommandError +from photologue.models import PhotoSize, ImageModel + + +class Command(BaseCommand): + help = ('Clears the Photologue cache for the given sizes.') + args = '[sizes]' + + requires_model_validation = True + can_import_settings = True + + def handle(self, *args, **options): + return create_cache(args, options) + + +def create_cache(sizes, options): + """ + Clears the cache for the given files + """ + size_list = [size.strip(' ,') for size in sizes] + + if len(size_list) < 1: + sizes = PhotoSize.objects.all() + else: + sizes = PhotoSize.objects.filter(name__in=size_list) + + if not len(sizes): + raise CommandError('No photo sizes were found.') + + print('Flushing cache...') + + for cls in ImageModel.__subclasses__(): + for photosize in sizes: + print('Flushing %s size images' % photosize.name) + for obj in cls.objects.all(): + obj.remove_size(photosize) diff --git a/photologue/managers.py b/photologue/managers.py new file mode 100644 index 00000000..61a440e6 --- /dev/null +++ b/photologue/managers.py @@ -0,0 +1,23 @@ +from django.db.models.query import QuerySet +from django.conf import settings + + +class SharedQueries(object): + + """Some queries that are identical for Gallery and Photo.""" + + def is_public(self): + """Trivial filter - will probably become more complex as time goes by!""" + return self.filter(is_public=True) + + def on_site(self): + """Return objects linked to the current site only.""" + return self.filter(sites__id=settings.SITE_ID) + + +class GalleryQuerySet(SharedQueries, QuerySet): + pass + + +class PhotoQuerySet(SharedQueries, QuerySet): + pass diff --git a/photologue/migrations/0001_initial.py b/photologue/migrations/0001_initial.py new file mode 100644 index 00000000..e68c0664 --- /dev/null +++ b/photologue/migrations/0001_initial.py @@ -0,0 +1,157 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import photologue.models +import django.utils.timezone +import django.core.validators +import sortedm2m.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('sites', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Gallery', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)), + ('date_added', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date published')), + ('title', models.CharField(max_length=50, verbose_name='title', unique=True)), + ('slug', models.SlugField(help_text='A "slug" is a unique URL-friendly title for an object.', verbose_name='title slug', unique=True)), + ('description', models.TextField(blank=True, verbose_name='description')), + ('is_public', models.BooleanField(help_text='Public galleries will be displayed in the default views.', verbose_name='is public', default=True)), + ('tags', photologue.models.TagField(max_length=255, help_text='Django-tagging was not found, tags will be treated as plain text.', blank=True, verbose_name='tags')), + ('sites', models.ManyToManyField(blank=True, verbose_name='sites', null=True, to='sites.Site')), + ], + options={ + 'get_latest_by': 'date_added', + 'verbose_name': 'gallery', + 'ordering': ['-date_added'], + 'verbose_name_plural': 'galleries', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='GalleryUpload', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)), + ('zip_file', models.FileField(help_text='Select a .zip file of images to upload into a new Gallery.', verbose_name='images file (.zip)', upload_to='photologue/temp')), + ('title', models.CharField(max_length=50, help_text='All uploaded photos will be given a title made up of this title + a sequential number.', verbose_name='title')), + ('caption', models.TextField(help_text='Caption will be added to all photos.', blank=True, verbose_name='caption')), + ('description', models.TextField(help_text='A description of this Gallery.', blank=True, verbose_name='description')), + ('is_public', models.BooleanField(help_text='Uncheck this to make the uploaded gallery and included photographs private.', verbose_name='is public', default=True)), + ('tags', models.CharField(max_length=255, help_text='Django-tagging was not found, tags will be treated as plain text.', blank=True, verbose_name='tags')), + ('gallery', models.ForeignKey(blank=True, verbose_name='gallery', null=True, help_text='Select a gallery to add these images to. Leave this empty to create a new gallery from the supplied title.', to='photologue.Gallery')), + ], + options={ + 'verbose_name': 'gallery upload', + 'verbose_name_plural': 'gallery uploads', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Photo', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)), + ('image', models.ImageField(upload_to=photologue.models.get_storage_path, verbose_name='image')), + ('date_taken', models.DateTimeField(verbose_name='date taken', blank=True, editable=False, null=True)), + ('view_count', models.PositiveIntegerField(verbose_name='view count', default=0, editable=False)), + ('crop_from', models.CharField(max_length=10, default='center', blank=True, verbose_name='crop from', choices=[('top', 'Top'), ('right', 'Right'), ('bottom', 'Bottom'), ('left', 'Left'), ('center', 'Center (Default)')])), + ('title', models.CharField(max_length=50, verbose_name='title', unique=True)), + ('slug', models.SlugField(help_text='A "slug" is a unique URL-friendly title for an object.', verbose_name='slug', unique=True)), + ('caption', models.TextField(blank=True, verbose_name='caption')), + ('date_added', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date added')), + ('is_public', models.BooleanField(help_text='Public photographs will be displayed in the default views.', verbose_name='is public', default=True)), + ('tags', photologue.models.TagField(max_length=255, help_text='Django-tagging was not found, tags will be treated as plain text.', blank=True, verbose_name='tags')), + ('sites', models.ManyToManyField(blank=True, verbose_name='sites', null=True, to='sites.Site')), + ], + options={ + 'get_latest_by': 'date_added', + 'verbose_name': 'photo', + 'ordering': ['-date_added'], + 'verbose_name_plural': 'photos', + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='gallery', + name='photos', + field=sortedm2m.fields.SortedManyToManyField(blank=True, verbose_name='photos', null=True, to='photologue.Photo'), + preserve_default=True, + ), + migrations.CreateModel( + name='PhotoEffect', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)), + ('name', models.CharField(max_length=30, verbose_name='name', unique=True)), + ('description', models.TextField(blank=True, verbose_name='description')), + ('transpose_method', models.CharField(max_length=15, blank=True, verbose_name='rotate or flip', choices=[('FLIP_LEFT_RIGHT', 'Flip left to right'), ('FLIP_TOP_BOTTOM', 'Flip top to bottom'), ('ROTATE_90', 'Rotate 90 degrees counter-clockwise'), ('ROTATE_270', 'Rotate 90 degrees clockwise'), ('ROTATE_180', 'Rotate 180 degrees')])), + ('color', models.FloatField(help_text='A factor of 0.0 gives a black and white image, a factor of 1.0 gives the original image.', verbose_name='color', default=1.0)), + ('brightness', models.FloatField(help_text='A factor of 0.0 gives a black image, a factor of 1.0 gives the original image.', verbose_name='brightness', default=1.0)), + ('contrast', models.FloatField(help_text='A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original image.', verbose_name='contrast', default=1.0)), + ('sharpness', models.FloatField(help_text='A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original image.', verbose_name='sharpness', default=1.0)), + ('filters', models.CharField(max_length=200, help_text='Chain multiple filters using the following pattern "FILTER_ONE->FILTER_TWO->FILTER_THREE". Image filters will be applied in order. The following filters are available: BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE, EMBOSS, FIND_EDGES, SHARPEN, SMOOTH, SMOOTH_MORE.', blank=True, verbose_name='filters')), + ('reflection_size', models.FloatField(help_text='The height of the reflection as a percentage of the orignal image. A factor of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the height of the orignal image.', verbose_name='size', default=0)), + ('reflection_strength', models.FloatField(help_text='The initial opacity of the reflection gradient.', verbose_name='strength', default=0.6)), + ('background_color', models.CharField(max_length=7, help_text='The background color of the reflection gradient. Set this to match the background color of your page.', verbose_name='color', default='#FFFFFF')), + ], + options={ + 'verbose_name': 'photo effect', + 'verbose_name_plural': 'photo effects', + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='photo', + name='effect', + field=models.ForeignKey(blank=True, verbose_name='effect', null=True, to='photologue.PhotoEffect'), + preserve_default=True, + ), + migrations.CreateModel( + name='PhotoSize', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)), + ('name', models.CharField(max_length=40, help_text='Photo size name should contain only letters, numbers and underscores. Examples: "thumbnail", "display", "small", "main_page_widget".', verbose_name='name', unique=True, validators=[django.core.validators.RegexValidator(regex='^[a-z0-9_]+$', message='Use only plain lowercase letters (ASCII), numbers and underscores.')])), + ('width', models.PositiveIntegerField(help_text='If width is set to "0" the image will be scaled to the supplied height.', verbose_name='width', default=0)), + ('height', models.PositiveIntegerField(help_text='If height is set to "0" the image will be scaled to the supplied width', verbose_name='height', default=0)), + ('quality', models.PositiveIntegerField(help_text='JPEG image quality.', verbose_name='quality', choices=[(30, 'Very Low'), (40, 'Low'), (50, 'Medium-Low'), (60, 'Medium'), (70, 'Medium-High'), (80, 'High'), (90, 'Very High')], default=70)), + ('upscale', models.BooleanField(help_text='If selected the image will be scaled up if necessary to fit the supplied dimensions. Cropped sizes will be upscaled regardless of this setting.', verbose_name='upscale images?', default=False)), + ('crop', models.BooleanField(help_text='If selected the image will be scaled and cropped to fit the supplied dimensions.', verbose_name='crop to fit?', default=False)), + ('pre_cache', models.BooleanField(help_text='If selected this photo size will be pre-cached as photos are added.', verbose_name='pre-cache?', default=False)), + ('increment_count', models.BooleanField(help_text='If selected the image\'s "view_count" will be incremented when this photo size is displayed.', verbose_name='increment view count?', default=False)), + ('effect', models.ForeignKey(blank=True, verbose_name='photo effect', null=True, to='photologue.PhotoEffect')), + ], + options={ + 'verbose_name': 'photo size', + 'ordering': ['width', 'height'], + 'verbose_name_plural': 'photo sizes', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Watermark', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)), + ('name', models.CharField(max_length=30, verbose_name='name', unique=True)), + ('description', models.TextField(blank=True, verbose_name='description')), + ('image', models.ImageField(upload_to='photologue/watermarks', verbose_name='image')), + ('style', models.CharField(max_length=5, default='scale', verbose_name='style', choices=[('tile', 'Tile'), ('scale', 'Scale')])), + ('opacity', models.FloatField(help_text='The opacity of the overlay.', verbose_name='opacity', default=1)), + ], + options={ + 'verbose_name': 'watermark', + 'verbose_name_plural': 'watermarks', + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='photosize', + name='watermark', + field=models.ForeignKey(blank=True, verbose_name='watermark image', null=True, to='photologue.Watermark'), + preserve_default=True, + ), + ] diff --git a/photologue/migrations/0002_photosize_data.py b/photologue/migrations/0002_photosize_data.py new file mode 100644 index 00000000..7d98c44a --- /dev/null +++ b/photologue/migrations/0002_photosize_data.py @@ -0,0 +1,43 @@ +# encoding: utf8 +from __future__ import unicode_literals + +from django.db import models, migrations + + +def initial_photosizes(apps, schema_editor): + + PhotoSize = apps.get_model('photologue', 'PhotoSize') + + # If there are already Photosizes, then we are upgrading an existing + # installation, we don't want to auto-create some PhotoSizes. + if PhotoSize.objects.all().count() > 0: + return + PhotoSize.objects.create(name='admin_thumbnail', + width=100, + height=75, + crop=True, + pre_cache=True, + increment_count=True) + PhotoSize.objects.create(name='thumbnail', + width=100, + height=75, + crop=True, + pre_cache=True, + increment_count=True) + PhotoSize.objects.create(name='display', + width=400, + crop=False, + pre_cache=True, + increment_count=True) + + +class Migration(migrations.Migration): + + dependencies = [ + ('photologue', '0001_initial'), + ('contenttypes', '0001_initial'), + ] + + operations = [ + migrations.RunPython(initial_photosizes), + ] diff --git a/photologue/migrations/0003_auto_20140822_1716.py b/photologue/migrations/0003_auto_20140822_1716.py new file mode 100644 index 00000000..46c31e97 --- /dev/null +++ b/photologue/migrations/0003_auto_20140822_1716.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('photologue', '0002_photosize_data'), + ] + + operations = [ + migrations.AlterField( + model_name='galleryupload', + name='title', + field=models.CharField(null=True, help_text='All uploaded photos will be given a title made up of this title + a sequential number.', max_length=50, verbose_name='title', blank=True), + ), + ] diff --git a/photologue/migrations/__init__.py b/photologue/migrations/__init__.py new file mode 100644 index 00000000..02f0fd6e --- /dev/null +++ b/photologue/migrations/__init__.py @@ -0,0 +1,18 @@ +""" +Migrations used by Django 1.7. +South migrations can be found in the ``south_migrations`` package. +""" + +# Code from http://treyhunner.com/2014/03/migrating-to-django-1-dot-7/ + +SOUTH_ERROR_MESSAGE = """\n +If you're on Django 1.6 (or earlier), you'll need to set SOUTH_MIGRATION_MODULES. +Please refer to the installation docs. +""" + +# Ensure the user is not using Django 1.6 or below with South +try: + from django.db import migrations +except ImportError: + from django.core.exceptions import ImproperlyConfigured + raise ImproperlyConfigured(SOUTH_ERROR_MESSAGE) diff --git a/photologue/models.py b/photologue/models.py new file mode 100644 index 00000000..2ee0cce4 --- /dev/null +++ b/photologue/models.py @@ -0,0 +1,1020 @@ +import os +import random +import zipfile +from datetime import datetime +from inspect import isclass +import warnings +import logging +from io import BytesIO +try: + from importlib import import_module +except ImportError: + # Compatibility with Python 2.6. + from django.utils.importlib import import_module + +import django +from django.utils.timezone import now +from django.db import models +from django.db.models.signals import post_init, post_save +from django.conf import settings +from django.core.files.base import ContentFile +from django.core.files.storage import default_storage +from django.core.urlresolvers import reverse +from django.core.exceptions import ValidationError +from django.template.defaultfilters import slugify +from django.utils.encoding import force_text, smart_str, filepath_to_uri +from django.utils.functional import curry +from django.utils.translation import ugettext_lazy as _ +from django.utils.encoding import python_2_unicode_compatible +from django.core.validators import RegexValidator +from django.contrib import messages +from django.contrib.sites.models import Site + +# Required PIL classes may or may not be available from the root namespace +# depending on the installation method used. +try: + import Image + import ImageFile + import ImageFilter + import ImageEnhance +except ImportError: + try: + from PIL import Image + from PIL import ImageFile + from PIL import ImageFilter + from PIL import ImageEnhance + except ImportError: + raise ImportError( + 'Photologue was unable to import the Python Imaging Library. Please confirm it`s installed and available on your current Python path.') + +from sortedm2m.fields import SortedManyToManyField +from model_utils.managers import PassThroughManager + +# attempt to load the django-tagging TagField from default location, +# otherwise we substitude a dummy TagField. +try: + from tagging.fields import TagField + tagfield_help_text = _('Separate tags with spaces, put quotes around multiple-word tags.') +except ImportError: + class TagField(models.CharField): + + def __init__(self, **kwargs): + default_kwargs = {'max_length': 255, 'blank': True} + default_kwargs.update(kwargs) + super(TagField, self).__init__(**default_kwargs) + + def get_internal_type(self): + return 'CharField' + tagfield_help_text = _('Django-tagging was not found, tags will be treated as plain text.') + + # Tell South how to handle this custom field. + if django.VERSION[:2] < (1, 7): + from south.modelsinspector import add_introspection_rules + add_introspection_rules([], ["^photologue\.models\.TagField"]) + +from .utils import EXIF +from .utils.reflection import add_reflection +from .utils.watermark import apply_watermark +from .managers import GalleryQuerySet, PhotoQuerySet + +logger = logging.getLogger('photologue.models') + +# Default limit for gallery.latest +LATEST_LIMIT = getattr(settings, 'PHOTOLOGUE_GALLERY_LATEST_LIMIT', None) + +# Number of random images from the gallery to display. +SAMPLE_SIZE = getattr(settings, 'PHOTOLOGUE_GALLERY_SAMPLE_SIZE', 5) + +# max_length setting for the ImageModel ImageField +IMAGE_FIELD_MAX_LENGTH = getattr(settings, 'PHOTOLOGUE_IMAGE_FIELD_MAX_LENGTH', 100) + +# Path to sample image +SAMPLE_IMAGE_PATH = getattr(settings, 'PHOTOLOGUE_SAMPLE_IMAGE_PATH', os.path.join( + os.path.dirname(__file__), 'res', 'sample.jpg')) # os.path.join(settings.PROJECT_PATH, 'photologue', 'res', 'sample.jpg' + +# Modify image file buffer size. +ImageFile.MAXBLOCK = getattr(settings, 'PHOTOLOGUE_MAXBLOCK', 256 * 2 ** 10) + +# Photologue image path relative to media root +PHOTOLOGUE_DIR = getattr(settings, 'PHOTOLOGUE_DIR', 'photologue') + +# Look for user function to define file paths +PHOTOLOGUE_PATH = getattr(settings, 'PHOTOLOGUE_PATH', None) +if PHOTOLOGUE_PATH is not None: + if callable(PHOTOLOGUE_PATH): + get_storage_path = PHOTOLOGUE_PATH + else: + parts = PHOTOLOGUE_PATH.split('.') + module_name = '.'.join(parts[:-1]) + module = import_module(module_name) + get_storage_path = getattr(module, parts[-1]) +else: + def get_storage_path(instance, filename): + return os.path.join(PHOTOLOGUE_DIR, 'photos', filename) + +# Quality options for JPEG images +JPEG_QUALITY_CHOICES = ( + (30, _('Very Low')), + (40, _('Low')), + (50, _('Medium-Low')), + (60, _('Medium')), + (70, _('Medium-High')), + (80, _('High')), + (90, _('Very High')), +) + +# choices for new crop_anchor field in Photo +CROP_ANCHOR_CHOICES = ( + ('top', _('Top')), + ('right', _('Right')), + ('bottom', _('Bottom')), + ('left', _('Left')), + ('center', _('Center (Default)')), +) + +IMAGE_TRANSPOSE_CHOICES = ( + ('FLIP_LEFT_RIGHT', _('Flip left to right')), + ('FLIP_TOP_BOTTOM', _('Flip top to bottom')), + ('ROTATE_90', _('Rotate 90 degrees counter-clockwise')), + ('ROTATE_270', _('Rotate 90 degrees clockwise')), + ('ROTATE_180', _('Rotate 180 degrees')), +) + +WATERMARK_STYLE_CHOICES = ( + ('tile', _('Tile')), + ('scale', _('Scale')), +) + +# Prepare a list of image filters +filter_names = [] +for n in dir(ImageFilter): + klass = getattr(ImageFilter, n) + if isclass(klass) and issubclass(klass, ImageFilter.BuiltinFilter) and \ + hasattr(klass, 'name'): + filter_names.append(klass.__name__) +IMAGE_FILTERS_HELP_TEXT = _( + 'Chain multiple filters using the following pattern "FILTER_ONE->FILTER_TWO->FILTER_THREE". Image filters will be applied in order. The following filters are available: %s.' % (', '.join(filter_names))) + + +@python_2_unicode_compatible +class Gallery(models.Model): + date_added = models.DateTimeField(_('date published'), + default=now) + title = models.CharField(_('title'), + max_length=50, + unique=True) + slug = models.SlugField(_('title slug'), + unique=True, + help_text=_('A "slug" is a unique URL-friendly title for an object.')) + description = models.TextField(_('description'), + blank=True) + is_public = models.BooleanField(_('is public'), + default=True, + help_text=_('Public galleries will be displayed ' + 'in the default views.')) + photos = SortedManyToManyField('Photo', + related_name='galleries', + verbose_name=_('photos'), + null=True, + blank=True) + tags = TagField(help_text=tagfield_help_text, verbose_name=_('tags')) + sites = models.ManyToManyField(Site, verbose_name=_(u'sites'), + blank=True, null=True) + + objects = PassThroughManager.for_queryset_class(GalleryQuerySet)() + + class Meta: + ordering = ['-date_added'] + get_latest_by = 'date_added' + verbose_name = _('gallery') + verbose_name_plural = _('galleries') + + def __str__(self): + return self.title + + def get_absolute_url(self): + return reverse('pl-gallery', args=[self.slug]) + + def latest(self, limit=LATEST_LIMIT, public=True): + if not limit: + limit = self.photo_count() + if public: + return self.public()[:limit] + else: + return self.photos.filter(sites__id=settings.SITE_ID)[:limit] + + def sample(self, count=None, public=True): + """Return a sample of photos, ordered at random. + If the 'count' is not specified, it will return a number of photos + limited by the GALLERY_SAMPLE_SIZE setting. + """ + if not count: + count = SAMPLE_SIZE + if count > self.photo_count(): + count = self.photo_count() + if public: + photo_set = self.public() + else: + photo_set = self.photos.filter(sites__id=settings.SITE_ID) + return random.sample(set(photo_set), count) + + def photo_count(self, public=True): + """Return a count of all the photos in this gallery.""" + if public: + return self.public().count() + else: + return self.photos.filter(sites__id=settings.SITE_ID).count() + photo_count.short_description = _('count') + + def public(self): + """Return a queryset of all the public photos in this gallery.""" + return self.photos.is_public().filter(sites__id=settings.SITE_ID) + + def orphaned_photos(self): + """ + Return all photos that belong to this gallery but don't share the + gallery's site. + """ + return self.photos.filter(is_public=True)\ + .exclude(sites__id__in=self.sites.all()) + + @property + def title_slug(self): + warnings.warn( + DeprecationWarning("`title_slug` field in Gallery is being renamed to `slug`. Update your code.")) + return self.slug + + +class GalleryUpload(models.Model): + zip_file = models.FileField(_('images file (.zip)'), + upload_to=os.path.join(PHOTOLOGUE_DIR, 'temp'), + help_text=_('Select a .zip file of images to upload into a new Gallery.')) + title = models.CharField(_('title'), + null=True, + blank=True, + max_length=50, + help_text=_('All uploaded photos will be given a title made up of this title + a ' + 'sequential number.')) + gallery = models.ForeignKey(Gallery, + verbose_name=_('gallery'), + null=True, + blank=True, + help_text=_('Select a gallery to add these images to. Leave this empty to ' + 'create a new gallery from the supplied title.')) + caption = models.TextField(_('caption'), + blank=True, + help_text=_('Caption will be added to all photos.')) + description = models.TextField(_('description'), + blank=True, + help_text=_('A description of this Gallery.')) + is_public = models.BooleanField(_('is public'), + default=True, + help_text=_('Uncheck this to make the uploaded ' + 'gallery and included photographs private.')) + tags = models.CharField(max_length=255, + blank=True, + help_text=tagfield_help_text, + verbose_name=_('tags')) + + class Meta: + verbose_name = _('gallery upload') + verbose_name_plural = _('gallery uploads') + + def save(self, *args, **kwargs): + super(GalleryUpload, self).save(*args, **kwargs) + gallery = self.process_zipfile() + super(GalleryUpload, self).delete() + return gallery + + def clean(self): + if self.title: + try: + Gallery.objects.get(title=self.title) + raise ValidationError(_('A gallery with that title already exists.')) + except Gallery.DoesNotExist: + pass + if not self.gallery and not self.title: + raise ValidationError(_('Select an existing gallery or enter a new gallery name.')) + + def process_zipfile(self): + if default_storage.exists(self.zip_file.name): + # TODO: implement try-except here + zip = zipfile.ZipFile(default_storage.open(self.zip_file.name)) + bad_file = zip.testzip() + if bad_file: + zip.close() + raise Exception('"%s" in the .zip archive is corrupt.' % bad_file) + count = 1 + current_site = Site.objects.get(id=settings.SITE_ID) + if self.gallery: + logger.debug('Using pre-existing gallery.') + gallery = self.gallery + else: + logger.debug(force_text('Creating new gallery "{0}".').format(self.title)) + gallery = Gallery.objects.create(title=self.title, + slug=slugify(self.title), + description=self.description, + is_public=self.is_public, + tags=self.tags) + gallery.sites.add(current_site) + for filename in sorted(zip.namelist()): + + logger.debug('Reading file "{0}".'.format(filename)) + + if filename.startswith('__') or filename.startswith('.'): + logger.debug('Ignoring file "{0}".'.format(filename)) + continue + + if os.path.dirname(filename): + logger.warning('Ignoring file "{0}" as it is in a subfolder; all images should be in the top ' + 'folder of the zip.'.format(filename)) + if getattr(self, 'request', None): + messages.warning(self.request, + _('Ignoring file "{filename}" as it is in a subfolder; all images should ' + 'be in the top folder of the zip.').format(filename=filename), + fail_silently=True) + continue + + data = zip.read(filename) + + if not len(data): + logger.debug('File "{0}" is empty.'.format(filename)) + continue + + title = ' '.join([gallery.title, str(count)]) + slug = slugify(title) + + try: + Photo.objects.get(slug=slug) + logger.warning('Did not create photo "{0}" with slug "{1}" as a photo with that ' + 'slug already exists.'.format(filename, slug)) + if getattr(self, 'request', None): + messages.warning(self.request, + _('Did not create photo "%(filename)s" with slug "{1}" as a photo with that ' + 'slug already exists.').format(filename, slug), + fail_silently=True) + continue + except Photo.DoesNotExist: + pass + + photo = Photo(title=title, + slug=slug, + caption=self.caption, + is_public=self.is_public, + tags=self.tags) + + # Basic check that we have a valid image. + try: + file = BytesIO(data) + opened = Image.open(file) + opened.verify() + except Exception: + # Pillow (or PIL) doesn't recognize it as an image. + # If a "bad" file is found we just skip it. + # But we do flag this both in the logs and to the user. + logger.error('Could not process file "{0}" in the .zip archive.'.format( + filename)) + if getattr(self, 'request', None): + messages.warning(self.request, + _('Could not process file "{0}" in the .zip archive.').format( + filename, + fail_silently=True)) + continue + + contentfile = ContentFile(data) + photo.image.save(filename, contentfile) + photo.save() + photo.sites.add(current_site) + gallery.photos.add(photo) + count = count + 1 + + zip.close() + return gallery + + +class ImageModel(models.Model): + image = models.ImageField(_('image'), + max_length=IMAGE_FIELD_MAX_LENGTH, + upload_to=get_storage_path) + date_taken = models.DateTimeField(_('date taken'), + null=True, + blank=True, + editable=False) + view_count = models.PositiveIntegerField(_('view count'), + default=0, + editable=False) + crop_from = models.CharField(_('crop from'), + blank=True, + max_length=10, + default='center', + choices=CROP_ANCHOR_CHOICES) + effect = models.ForeignKey('PhotoEffect', + null=True, + blank=True, + related_name="%(class)s_related", + verbose_name=_('effect')) + + class Meta: + abstract = True + + @property + def EXIF(self): + try: + f = self.image.storage.open(self.image.name, 'rb') + tags = EXIF.process_file(f) + f.close() + return tags + except: + try: + f = self.image.storage.open(self.image.name, 'rb') + tags = EXIF.process_file(f, details=False) + f.close() + return tags + except: + return {} + + def admin_thumbnail(self): + func = getattr(self, 'get_admin_thumbnail_url', None) + if func is None: + return _('An "admin_thumbnail" photo size has not been defined.') + else: + if hasattr(self, 'get_absolute_url'): + return u'' % \ + (self.get_absolute_url(), func()) + else: + return u'' % \ + (self.image.url, func()) + admin_thumbnail.short_description = _('Thumbnail') + admin_thumbnail.allow_tags = True + + def cache_path(self): + return os.path.join(os.path.dirname(self.image.name), "cache") + + def cache_url(self): + return '/'.join([os.path.dirname(self.image.url), "cache"]) + + def image_filename(self): + return os.path.basename(force_text(self.image.name)) + + def _get_filename_for_size(self, size): + size = getattr(size, 'name', size) + base, ext = os.path.splitext(self.image_filename()) + return ''.join([base, '_', size, ext]) + + def _get_SIZE_photosize(self, size): + return PhotoSizeCache().sizes.get(size) + + def _get_SIZE_size(self, size): + photosize = PhotoSizeCache().sizes.get(size) + if not self.size_exists(photosize): + self.create_size(photosize) + return Image.open(self.image.storage.open( + self._get_SIZE_filename(size))).size + + def _get_SIZE_url(self, size): + photosize = PhotoSizeCache().sizes.get(size) + if not self.size_exists(photosize): + self.create_size(photosize) + if photosize.increment_count: + self.increment_count() + return '/'.join([ + self.cache_url(), + filepath_to_uri(self._get_filename_for_size(photosize.name))]) + + def _get_SIZE_filename(self, size): + photosize = PhotoSizeCache().sizes.get(size) + return smart_str(os.path.join(self.cache_path(), + self._get_filename_for_size(photosize.name))) + + def increment_count(self): + self.view_count += 1 + models.Model.save(self) + + def add_accessor_methods(self, *args, **kwargs): + for size in PhotoSizeCache().sizes.keys(): + setattr(self, 'get_%s_size' % size, + curry(self._get_SIZE_size, size=size)) + setattr(self, 'get_%s_photosize' % size, + curry(self._get_SIZE_photosize, size=size)) + setattr(self, 'get_%s_url' % size, + curry(self._get_SIZE_url, size=size)) + setattr(self, 'get_%s_filename' % size, + curry(self._get_SIZE_filename, size=size)) + + def size_exists(self, photosize): + func = getattr(self, "get_%s_filename" % photosize.name, None) + if func is not None: + if self.image.storage.exists(func()): + return True + return False + + def resize_image(self, im, photosize): + cur_width, cur_height = im.size + new_width, new_height = photosize.size + if photosize.crop: + ratio = max(float(new_width) / cur_width, float(new_height) / cur_height) + x = (cur_width * ratio) + y = (cur_height * ratio) + xd = abs(new_width - x) + yd = abs(new_height - y) + x_diff = int(xd / 2) + y_diff = int(yd / 2) + if self.crop_from == 'top': + box = (int(x_diff), 0, int(x_diff + new_width), new_height) + elif self.crop_from == 'left': + box = (0, int(y_diff), new_width, int(y_diff + new_height)) + elif self.crop_from == 'bottom': + # y - yd = new_height + box = (int(x_diff), int(yd), int(x_diff + new_width), int(y)) + elif self.crop_from == 'right': + # x - xd = new_width + box = (int(xd), int(y_diff), int(x), int(y_diff + new_height)) + else: + box = (int(x_diff), int(y_diff), int(x_diff + new_width), int(y_diff + new_height)) + im = im.resize((int(x), int(y)), Image.ANTIALIAS).crop(box) + else: + if not new_width == 0 and not new_height == 0: + ratio = min(float(new_width) / cur_width, + float(new_height) / cur_height) + else: + if new_width == 0: + ratio = float(new_height) / cur_height + else: + ratio = float(new_width) / cur_width + new_dimensions = (int(round(cur_width * ratio)), + int(round(cur_height * ratio))) + if new_dimensions[0] > cur_width or \ + new_dimensions[1] > cur_height: + if not photosize.upscale: + return im + im = im.resize(new_dimensions, Image.ANTIALIAS) + return im + + def create_size(self, photosize): + if self.size_exists(photosize): + return + try: + im = Image.open(self.image.storage.open(self.image.name)) + except IOError: + return + # Save the original format + im_format = im.format + # Apply effect if found + if self.effect is not None: + im = self.effect.pre_process(im) + elif photosize.effect is not None: + im = photosize.effect.pre_process(im) + # Resize/crop image + if im.size != photosize.size and photosize.size != (0, 0): + im = self.resize_image(im, photosize) + # Apply watermark if found + if photosize.watermark is not None: + im = photosize.watermark.post_process(im) + # Apply effect if found + if self.effect is not None: + im = self.effect.post_process(im) + elif photosize.effect is not None: + im = photosize.effect.post_process(im) + # Save file + im_filename = getattr(self, "get_%s_filename" % photosize.name)() + try: + buffer = BytesIO() + if im_format != 'JPEG': + im.save(buffer, im_format) + else: + im.save(buffer, 'JPEG', quality=int(photosize.quality), + optimize=True) + buffer_contents = ContentFile(buffer.getvalue()) + self.image.storage.save(im_filename, buffer_contents) + except IOError as e: + if self.image.storage.exists(im_filename): + self.image.storage.delete(im_filename) + raise e + + def remove_size(self, photosize, remove_dirs=True): + if not self.size_exists(photosize): + return + filename = getattr(self, "get_%s_filename" % photosize.name)() + if self.image.storage.exists(filename): + self.image.storage.delete(filename) + + def clear_cache(self): + cache = PhotoSizeCache() + for photosize in cache.sizes.values(): + self.remove_size(photosize, False) + + def pre_cache(self): + cache = PhotoSizeCache() + for photosize in cache.sizes.values(): + if photosize.pre_cache: + self.create_size(photosize) + + def save(self, *args, **kwargs): + if self.date_taken is None: + try: + exif_date = self.EXIF.get('EXIF DateTimeOriginal', None) + if exif_date is not None: + d, t = str.split(exif_date.values) + year, month, day = d.split(':') + hour, minute, second = t.split(':') + self.date_taken = datetime(int(year), int(month), int(day), + int(hour), int(minute), int(second)) + except: + pass + if self.date_taken is None: + self.date_taken = now() + if self._get_pk_val(): + self.clear_cache() + super(ImageModel, self).save(*args, **kwargs) + self.pre_cache() + + def delete(self): + assert self._get_pk_val() is not None, "%s object can't be deleted because its %s attribute is set to None." % ( + self._meta.object_name, self._meta.pk.attname) + self.clear_cache() + # Files associated to a FileField have to be manually deleted: + # https://docs.djangoproject.com/en/dev/releases/1.3/#deleting-a-model-doesn-t-delete-associated-files + # http://haineault.com/blog/147/ + # The data loss scenarios mentioned in the docs hopefully do not apply + # to Photologue! + super(ImageModel, self).delete() + self.image.storage.delete(self.image.name) + + +@python_2_unicode_compatible +class Photo(ImageModel): + title = models.CharField(_('title'), + max_length=50, + unique=True) + slug = models.SlugField(_('slug'), + unique=True, + help_text=_('A "slug" is a unique URL-friendly title for an object.')) + caption = models.TextField(_('caption'), + blank=True) + date_added = models.DateTimeField(_('date added'), + default=now) + is_public = models.BooleanField(_('is public'), + default=True, + help_text=_('Public photographs will be displayed in the default views.')) + tags = TagField(help_text=tagfield_help_text, verbose_name=_('tags')) + sites = models.ManyToManyField(Site, verbose_name=_(u'sites'), + blank=True, null=True) + + objects = PassThroughManager.for_queryset_class(PhotoQuerySet)() + + class Meta: + ordering = ['-date_added'] + get_latest_by = 'date_added' + verbose_name = _("photo") + verbose_name_plural = _("photos") + + def __str__(self): + return self.title + + def save(self, *args, **kwargs): + if self.slug is None: + self.slug = slugify(self.title) + super(Photo, self).save(*args, **kwargs) + + def get_absolute_url(self): + return reverse('pl-photo', args=[self.slug]) + + def public_galleries(self): + """Return the public galleries to which this photo belongs.""" + return self.galleries.filter(is_public=True) + + def get_previous_in_gallery(self, gallery): + """Find the neighbour of this photo in the supplied gallery. + We assume that the gallery and all its photos are on the same site. + """ + if not self.is_public: + raise ValueError('Cannot determine neighbours of a non-public photo.') + photos = gallery.photos.is_public() + if not self in photos: + raise ValueError('Photo does not belong to gallery.') + previous = None + for photo in photos: + if photo == self: + return previous + previous = photo + + def get_next_in_gallery(self, gallery): + """Find the neighbour of this photo in the supplied gallery. + We assume that the gallery and all its photos are on the same site. + """ + if not self.is_public: + raise ValueError('Cannot determine neighbours of a non-public photo.') + photos = gallery.photos.is_public() + if not self in photos: + raise ValueError('Photo does not belong to gallery.') + matched = False + for photo in photos: + if matched: + return photo + if photo == self: + matched = True + return None + + @property + def title_slug(self): + warnings.warn( + DeprecationWarning("`title_slug` field in Photo is being renamed to `slug`. Update your code.")) + return self.slug + + +@python_2_unicode_compatible +class BaseEffect(models.Model): + name = models.CharField(_('name'), + max_length=30, + unique=True) + description = models.TextField(_('description'), + blank=True) + + class Meta: + abstract = True + + def sample_dir(self): + return os.path.join(PHOTOLOGUE_DIR, 'samples') + + def sample_url(self): + return settings.MEDIA_URL + '/'.join([PHOTOLOGUE_DIR, 'samples', '%s %s.jpg' % (self.name.lower(), 'sample')]) + + def sample_filename(self): + return os.path.join(self.sample_dir(), '%s %s.jpg' % (self.name.lower(), 'sample')) + + def create_sample(self): + try: + im = Image.open(SAMPLE_IMAGE_PATH) + except IOError: + raise IOError( + 'Photologue was unable to open the sample image: %s.' % SAMPLE_IMAGE_PATH) + im = self.process(im) + buffer = BytesIO() + im.save(buffer, 'JPEG', quality=90, optimize=True) + buffer_contents = ContentFile(buffer.getvalue()) + default_storage.save(self.sample_filename(), buffer_contents) + + def admin_sample(self): + return u'' % self.sample_url() + admin_sample.short_description = 'Sample' + admin_sample.allow_tags = True + + def pre_process(self, im): + return im + + def post_process(self, im): + return im + + def process(self, im): + im = self.pre_process(im) + im = self.post_process(im) + return im + + def __str__(self): + return self.name + + def save(self, *args, **kwargs): + try: + default_storage.delete(self.sample_filename()) + except: + pass + models.Model.save(self, *args, **kwargs) + self.create_sample() + for size in self.photo_sizes.all(): + size.clear_cache() + # try to clear all related subclasses of ImageModel + for prop in [prop for prop in dir(self) if prop[-8:] == '_related']: + for obj in getattr(self, prop).all(): + obj.clear_cache() + obj.pre_cache() + + def delete(self): + try: + default_storage.delete(self.sample_filename()) + except: + pass + models.Model.delete(self) + + +class PhotoEffect(BaseEffect): + + """ A pre-defined effect to apply to photos """ + transpose_method = models.CharField(_('rotate or flip'), + max_length=15, + blank=True, + choices=IMAGE_TRANSPOSE_CHOICES) + color = models.FloatField(_('color'), + default=1.0, + help_text=_("A factor of 0.0 gives a black and white image, a factor of 1.0 gives the original image.")) + brightness = models.FloatField(_('brightness'), + default=1.0, + help_text=_("A factor of 0.0 gives a black image, a factor of 1.0 gives the original image.")) + contrast = models.FloatField(_('contrast'), + default=1.0, + help_text=_("A factor of 0.0 gives a solid grey image, a factor of 1.0 gives the original image.")) + sharpness = models.FloatField(_('sharpness'), + default=1.0, + help_text=_("A factor of 0.0 gives a blurred image, a factor of 1.0 gives the original image.")) + filters = models.CharField(_('filters'), + max_length=200, + blank=True, + help_text=_(IMAGE_FILTERS_HELP_TEXT)) + reflection_size = models.FloatField(_('size'), + default=0, + help_text=_("The height of the reflection as a percentage of the orignal image. A factor of 0.0 adds no reflection, a factor of 1.0 adds a reflection equal to the height of the orignal image.")) + reflection_strength = models.FloatField(_('strength'), + default=0.6, + help_text=_("The initial opacity of the reflection gradient.")) + background_color = models.CharField(_('color'), + max_length=7, + default="#FFFFFF", + help_text=_("The background color of the reflection gradient. Set this to match the background color of your page.")) + + class Meta: + verbose_name = _("photo effect") + verbose_name_plural = _("photo effects") + + def pre_process(self, im): + if self.transpose_method != '': + method = getattr(Image, self.transpose_method) + im = im.transpose(method) + if im.mode != 'RGB' and im.mode != 'RGBA': + return im + for name in ['Color', 'Brightness', 'Contrast', 'Sharpness']: + factor = getattr(self, name.lower()) + if factor != 1.0: + im = getattr(ImageEnhance, name)(im).enhance(factor) + for name in self.filters.split('->'): + image_filter = getattr(ImageFilter, name.upper(), None) + if image_filter is not None: + try: + im = im.filter(image_filter) + except ValueError: + pass + return im + + def post_process(self, im): + if self.reflection_size != 0.0: + im = add_reflection(im, bgcolor=self.background_color, + amount=self.reflection_size, opacity=self.reflection_strength) + return im + + +class Watermark(BaseEffect): + image = models.ImageField(_('image'), + upload_to=PHOTOLOGUE_DIR + "/watermarks") + style = models.CharField(_('style'), + max_length=5, + choices=WATERMARK_STYLE_CHOICES, + default='scale') + opacity = models.FloatField(_('opacity'), + default=1, + help_text=_("The opacity of the overlay.")) + + class Meta: + verbose_name = _('watermark') + verbose_name_plural = _('watermarks') + + def delete(self): + assert self._get_pk_val() is not None, "%s object can't be deleted because its %s attribute is set to None." % ( + self._meta.object_name, self._meta.pk.attname) + super(Watermark, self).delete() + self.image.storage.delete(self.image.name) + + def post_process(self, im): + mark = Image.open(self.image.storage.open(self.image.name)) + return apply_watermark(im, mark, self.style, self.opacity) + + +@python_2_unicode_compatible +class PhotoSize(models.Model): + + """About the Photosize name: it's used to create get_PHOTOSIZE_url() methods, + so the name has to follow the same restrictions as any Python method name, + e.g. no spaces or non-ascii characters.""" + + name = models.CharField(_('name'), + max_length=40, + unique=True, + help_text=_( + 'Photo size name should contain only letters, numbers and underscores. Examples: "thumbnail", "display", "small", "main_page_widget".'), + validators=[RegexValidator(regex='^[a-z0-9_]+$', + message='Use only plain lowercase letters (ASCII), numbers and underscores.' + )] + ) + width = models.PositiveIntegerField(_('width'), + default=0, + help_text=_('If width is set to "0" the image will be scaled to the supplied height.')) + height = models.PositiveIntegerField(_('height'), + default=0, + help_text=_('If height is set to "0" the image will be scaled to the supplied width')) + quality = models.PositiveIntegerField(_('quality'), + choices=JPEG_QUALITY_CHOICES, + default=70, + help_text=_('JPEG image quality.')) + upscale = models.BooleanField(_('upscale images?'), + default=False, + help_text=_('If selected the image will be scaled up if necessary to fit the supplied dimensions. Cropped sizes will be upscaled regardless of this setting.')) + crop = models.BooleanField(_('crop to fit?'), + default=False, + help_text=_('If selected the image will be scaled and cropped to fit the supplied dimensions.')) + pre_cache = models.BooleanField(_('pre-cache?'), + default=False, + help_text=_('If selected this photo size will be pre-cached as photos are added.')) + increment_count = models.BooleanField(_('increment view count?'), + default=False, + help_text=_('If selected the image\'s "view_count" will be incremented when this photo size is displayed.')) + effect = models.ForeignKey('PhotoEffect', + null=True, + blank=True, + related_name='photo_sizes', + verbose_name=_('photo effect')) + watermark = models.ForeignKey('Watermark', + null=True, + blank=True, + related_name='photo_sizes', + verbose_name=_('watermark image')) + + class Meta: + ordering = ['width', 'height'] + verbose_name = _('photo size') + verbose_name_plural = _('photo sizes') + + def __str__(self): + return self.name + + def clear_cache(self): + for cls in ImageModel.__subclasses__(): + for obj in cls.objects.all(): + obj.remove_size(self) + if self.pre_cache: + obj.create_size(self) + PhotoSizeCache().reset() + + def clean(self): + if self.crop is True: + if self.width == 0 or self.height == 0: + raise ValidationError( + _("Can only crop photos if both width and height dimensions are set.")) + + def save(self, *args, **kwargs): + super(PhotoSize, self).save(*args, **kwargs) + PhotoSizeCache().reset() + self.clear_cache() + + def delete(self): + assert self._get_pk_val() is not None, "%s object can't be deleted because its %s attribute is set to None." % ( + self._meta.object_name, self._meta.pk.attname) + self.clear_cache() + super(PhotoSize, self).delete() + + def _get_size(self): + return (self.width, self.height) + + def _set_size(self, value): + self.width, self.height = value + size = property(_get_size, _set_size) + + +class PhotoSizeCache(object): + __state = {"sizes": {}} + + def __init__(self): + self.__dict__ = self.__state + if not len(self.sizes): + sizes = PhotoSize.objects.all() + for size in sizes: + self.sizes[size.name] = size + + def reset(self): + self.sizes = {} + + +# Set up the accessor methods +def add_methods(sender, instance, signal, *args, **kwargs): + """ Adds methods to access sized images (urls, paths) + + after the Photo model's __init__ function completes, + this method calls "add_accessor_methods" on each instance. + """ + if hasattr(instance, 'add_accessor_methods'): + instance.add_accessor_methods() +post_init.connect(add_methods) + + +def add_default_site(instance, created, **kwargs): + """ + Called via Django's signals when an instance is created. + In case PHOTOLOGUE_MULTISITE is False, the current site (i.e. + ``settings.SITE_ID``) will always be added to the site relations if none are + present. + """ + if not created: + return + if getattr(settings, 'PHOTOLOGUE_MULTISITE', False): + return + if instance.sites.exists(): + return + instance.sites.add(Site.objects.get_current()) +post_save.connect(add_default_site, sender=Gallery) +post_save.connect(add_default_site, sender=Photo) diff --git a/photologue/res/sample.jpg b/photologue/res/sample.jpg new file mode 100644 index 0000000000000000000000000000000000000000..07147aaa2479e8fd1440316544125750d30d06c3 GIT binary patch literal 14453 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 literal 0 HcmV?d00001 diff --git a/photologue/res/test_photologue_landscape.jpg b/photologue/res/test_photologue_landscape.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fd821d8a71bf3d1b8f7ea2076087cb1137cc561d GIT binary patch literal 659 zcmeH@I}XAy42FM`G)bfM5vlh`2;K*{QbbW&}XYg9EG3J)A0MGIG{B&Uv~ zjI>coD`l*S8Dp($;hH4Q`Ie%CWE2@~GHbIUP1DYQ-Gmz6;E0PLkC7+gDV(tY5#QJ+ e9vI}GGw=fw?r?&5v+x+>)bv;W`=5Lu3%56+KqI^W literal 0 HcmV?d00001 diff --git a/photologue/res/test_photologue_portrait.jpg b/photologue/res/test_photologue_portrait.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e4d332805039835a84f121bcff16637a7786236 GIT binary patch literal 659 zcmeH@I}XAy42FM`G)bfM5vlh`2;K*{QbbW&}XYg9EG3J)A0MGIG{B&Uv~ zjI>coD`l*S8Dp($;hH4Q`Ie%CWE2@~GHbIUP1DYQ-Gmz6;DVzdkC7+gDV(tY5#QJ+ e9vI}GGw=fw?r?&5v+x+>)bv;W`=5Lu3%56+q$9il literal 0 HcmV?d00001 diff --git a/photologue/res/test_photologue_square.jpg b/photologue/res/test_photologue_square.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd03d8f3c606ba3dc4932e0d366c254f3786ca42 GIT binary patch literal 573 zcmeH>Jqp4=5JtbrZZ?}`v&lm4BZ36fTWG8-tSsz3Lt3wr!bAAerGQx1@fW1Z;Sn7nk(4gTjPwD1}Y8bKbBC*dhvu?7+UI3}GK Y6yG=S6B8b=f;d@t%y8+(k^ep1Klx!JdjJ3c literal 0 HcmV?d00001 diff --git a/photologue/res/zips/ignored_files.zip b/photologue/res/zips/ignored_files.zip new file mode 100644 index 0000000000000000000000000000000000000000..451c760587b7bd48605b1102311756aba5fe00f3 GIT binary patch literal 15784 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 PKjjDj0Q~oP0Kk6%;zGcz literal 0 HcmV?d00001 diff --git a/photologue/res/zips/not_image.zip b/photologue/res/zips/not_image.zip new file mode 100644 index 0000000000000000000000000000000000000000..0ff5a218ea85a16cf9c199dbbef55dd1b0d3d6ba GIT binary patch literal 7815 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 literal 0 HcmV?d00001 diff --git a/photologue/sitemaps.py b/photologue/sitemaps.py new file mode 100644 index 00000000..48b95830 --- /dev/null +++ b/photologue/sitemaps.py @@ -0,0 +1,56 @@ +""" +The `Sitemaps protocol `_ allows a webmaster +to inform search engines about URLs on a website that are available for crawling. +Django comes with a high-level framework that makes generating sitemap XML files easy. + +Install the sitemap application as per the `instructions in the django documentation +`_, then edit your +project's ``urls.py`` and add a reference to Photologue's Sitemap classes in order to +included all the publicly-viewable Photologue pages: + +.. code-block:: python + + ... + from photologue.sitemaps import GallerySitemap, PhotoSitemap + + sitemaps = {... + 'photologue_galleries': GallerySitemap, + 'photologue_photos': PhotoSitemap, + ... + } + etc... + +There are 2 sitemap classes, as in some cases you may want to have gallery pages, +but no photo detail page (e.g. if all photos are displayed via a javascript +lightbox). + +""" +from django.contrib.sitemaps import Sitemap +from .models import Gallery, Photo + +# Note: Gallery and Photo are split, because there are use cases for having galleries +# in the sitemap, but not photos (e.g. if the photos are displayed with a lightbox). + + +class GallerySitemap(Sitemap): + priority = 0.5 + + def items(self): + # The following code is very basic and will probably cause problems with + # large querysets. + return Gallery.objects.filter(is_public=True) + + def lastmod(self, obj): + return obj.date_added + + +class PhotoSitemap(Sitemap): + priority = 0.5 + + def items(self): + # The following code is very basic and will probably cause problems with + # large querysets. + return Photo.objects.filter(is_public=True) + + def lastmod(self, obj): + return obj.date_added diff --git a/photologue/south_migrations/0001_initial.py b/photologue/south_migrations/0001_initial.py new file mode 100644 index 00000000..09c91510 --- /dev/null +++ b/photologue/south_migrations/0001_initial.py @@ -0,0 +1,207 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Gallery' + db.create_table('photologue_gallery', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('date_added', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('title', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)), + ('title_slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=50)), + ('description', self.gf('django.db.models.fields.TextField')(blank=True)), + ('is_public', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('tags', self.gf('photologue.models.TagField')(max_length=255, blank=True)), + )) + db.send_create_signal('photologue', ['Gallery']) + + # Adding M2M table for field photos on 'Gallery' + db.create_table('photologue_gallery_photos', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('gallery', models.ForeignKey(orm['photologue.gallery'], null=False)), + ('photo', models.ForeignKey(orm['photologue.photo'], null=False)) + )) + db.create_unique('photologue_gallery_photos', ['gallery_id', 'photo_id']) + + # Adding model 'GalleryUpload' + db.create_table('photologue_galleryupload', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('zip_file', self.gf('django.db.models.fields.files.FileField')(max_length=100)), + ('gallery', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['photologue.Gallery'], null=True, blank=True)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=75)), + ('caption', self.gf('django.db.models.fields.TextField')(blank=True)), + ('description', self.gf('django.db.models.fields.TextField')(blank=True)), + ('is_public', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('tags', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)), + )) + db.send_create_signal('photologue', ['GalleryUpload']) + + # Adding model 'Photo' + db.create_table('photologue_photo', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('image', self.gf('django.db.models.fields.files.ImageField')(max_length=100)), + ('date_taken', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('view_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('crop_from', self.gf('django.db.models.fields.CharField')(default='center', max_length=10, blank=True)), + ('effect', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='photo_related', null=True, to=orm['photologue.PhotoEffect'])), + ('title', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)), + ('title_slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=50)), + ('caption', self.gf('django.db.models.fields.TextField')(blank=True)), + ('date_added', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('is_public', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('tags', self.gf('photologue.models.TagField')(max_length=255, blank=True)), + )) + db.send_create_signal('photologue', ['Photo']) + + # Adding model 'PhotoEffect' + db.create_table('photologue_photoeffect', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=30)), + ('description', self.gf('django.db.models.fields.TextField')(blank=True)), + ('transpose_method', self.gf('django.db.models.fields.CharField')(max_length=15, blank=True)), + ('color', self.gf('django.db.models.fields.FloatField')(default=1.0)), + ('brightness', self.gf('django.db.models.fields.FloatField')(default=1.0)), + ('contrast', self.gf('django.db.models.fields.FloatField')(default=1.0)), + ('sharpness', self.gf('django.db.models.fields.FloatField')(default=1.0)), + ('filters', self.gf('django.db.models.fields.CharField')(max_length=200, blank=True)), + ('reflection_size', self.gf('django.db.models.fields.FloatField')(default=0)), + ('reflection_strength', self.gf('django.db.models.fields.FloatField')(default=0.6)), + ('background_color', self.gf('django.db.models.fields.CharField')(default='#FFFFFF', max_length=7)), + )) + db.send_create_signal('photologue', ['PhotoEffect']) + + # Adding model 'Watermark' + db.create_table('photologue_watermark', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=30)), + ('description', self.gf('django.db.models.fields.TextField')(blank=True)), + ('image', self.gf('django.db.models.fields.files.ImageField')(max_length=100)), + ('style', self.gf('django.db.models.fields.CharField')(default='scale', max_length=5)), + ('opacity', self.gf('django.db.models.fields.FloatField')(default=1)), + )) + db.send_create_signal('photologue', ['Watermark']) + + # Adding model 'PhotoSize' + db.create_table('photologue_photosize', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=20)), + ('width', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('height', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('quality', self.gf('django.db.models.fields.PositiveIntegerField')(default=70)), + ('upscale', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('crop', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('pre_cache', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('increment_count', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('effect', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='photo_sizes', null=True, to=orm['photologue.PhotoEffect'])), + ('watermark', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='photo_sizes', null=True, to=orm['photologue.Watermark'])), + )) + db.send_create_signal('photologue', ['PhotoSize']) + + + def backwards(self, orm): + # Deleting model 'Gallery' + db.delete_table('photologue_gallery') + + # Removing M2M table for field photos on 'Gallery' + db.delete_table('photologue_gallery_photos') + + # Deleting model 'GalleryUpload' + db.delete_table('photologue_galleryupload') + + # Deleting model 'Photo' + db.delete_table('photologue_photo') + + # Deleting model 'PhotoEffect' + db.delete_table('photologue_photoeffect') + + # Deleting model 'Watermark' + db.delete_table('photologue_watermark') + + # Deleting model 'PhotoSize' + db.delete_table('photologue_photosize') + + + models = { + 'photologue.gallery': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Gallery'}, + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'photos': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'galleries'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['photologue.Photo']"}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'title_slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}) + }, + 'photologue.galleryupload': { + 'Meta': {'object_name': 'GalleryUpload'}, + 'caption': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gallery': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['photologue.Gallery']", 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'tags': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '75'}), + 'zip_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}) + }, + 'photologue.photo': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Photo'}, + 'caption': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'crop_from': ('django.db.models.fields.CharField', [], {'default': "'center'", 'max_length': '10', 'blank': 'True'}), + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_related'", 'null': 'True', 'to': "orm['photologue.PhotoEffect']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'title_slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + 'photologue.photoeffect': { + 'Meta': {'object_name': 'PhotoEffect'}, + 'background_color': ('django.db.models.fields.CharField', [], {'default': "'#FFFFFF'", 'max_length': '7'}), + 'brightness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'color': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'contrast': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'filters': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'reflection_size': ('django.db.models.fields.FloatField', [], {'default': '0'}), + 'reflection_strength': ('django.db.models.fields.FloatField', [], {'default': '0.6'}), + 'sharpness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'transpose_method': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'}) + }, + 'photologue.photosize': { + 'Meta': {'ordering': "['width', 'height']", 'object_name': 'PhotoSize'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_sizes'", 'null': 'True', 'to': "orm['photologue.PhotoEffect']"}), + 'height': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'increment_count': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}), + 'pre_cache': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'quality': ('django.db.models.fields.PositiveIntegerField', [], {'default': '70'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'watermark': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_sizes'", 'null': 'True', 'to': "orm['photologue.Watermark']"}), + 'width': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + 'photologue.watermark': { + 'Meta': {'object_name': 'Watermark'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'opacity': ('django.db.models.fields.FloatField', [], {'default': '1'}), + 'style': ('django.db.models.fields.CharField', [], {'default': "'scale'", 'max_length': '5'}) + } + } + + complete_apps = ['photologue'] \ No newline at end of file diff --git a/photologue/south_migrations/0002_auto__chg_field_gallery_title__chg_field_galleryupload_title__chg_fiel.py b/photologue/south_migrations/0002_auto__chg_field_gallery_title__chg_field_galleryupload_title__chg_fiel.py new file mode 100644 index 00000000..519f2b8b --- /dev/null +++ b/photologue/south_migrations/0002_auto__chg_field_gallery_title__chg_field_galleryupload_title__chg_fiel.py @@ -0,0 +1,145 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models, IntegrityError + + +class Migration(SchemaMigration): + + def forwards(self, orm): + + if not db.dry_run: + for gallery in orm.Gallery.objects.all(): + if len(gallery.title) > 50: + gallery.title = gallery.title[:50] + while orm.Gallery.objects.filter(title=gallery.title).exists(): + try: + number = int(gallery.title[-1]) + except ValueError: + number = 0 + + number += 1 + gallery.title = gallery.title[:49] + unicode(number) + if number > 9: + break + gallery.save() + db.commit_transaction() # Commit the shorter gallery titles + db.start_transaction() + + # Changing field 'Gallery.title' + db.alter_column('photologue_gallery', 'title', self.gf('django.db.models.fields.CharField')(unique=True, max_length=50)) + + # Changing field 'GalleryUpload.title' + db.alter_column('photologue_galleryupload', 'title', self.gf('django.db.models.fields.CharField')(max_length=50)) + + if not db.dry_run: + for photo in orm.Photo.objects.all(): + photo.title = photo.title[:50] + while orm.Photo.objects.filter(title=photo.title).exists(): + try: + number = int(photo.title[-1]) + except ValueError: + number = 0 + + number += 1 + photo.title = photo.title[:49] + unicode(number) + if number > 9: + break + photo.save() + db.commit_transaction() # Commit the shorter photo titles + db.start_transaction() + + # Changing field 'Photo.title' + db.alter_column('photologue_photo', 'title', self.gf('django.db.models.fields.CharField')(unique=True, max_length=50)) + + def backwards(self, orm): + + # Changing field 'Gallery.title' + db.alter_column('photologue_gallery', 'title', self.gf('django.db.models.fields.CharField')(max_length=100, unique=True)) + + # Changing field 'GalleryUpload.title' + db.alter_column('photologue_galleryupload', 'title', self.gf('django.db.models.fields.CharField')(max_length=75)) + + # Changing field 'Photo.title' + db.alter_column('photologue_photo', 'title', self.gf('django.db.models.fields.CharField')(max_length=100, unique=True)) + + models = { + 'photologue.gallery': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Gallery'}, + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'photos': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'galleries'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['photologue.Photo']"}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}), + 'title_slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}) + }, + 'photologue.galleryupload': { + 'Meta': {'object_name': 'GalleryUpload'}, + 'caption': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gallery': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['photologue.Gallery']", 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'tags': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'zip_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}) + }, + 'photologue.photo': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Photo'}, + 'caption': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'crop_from': ('django.db.models.fields.CharField', [], {'default': "'center'", 'max_length': '10', 'blank': 'True'}), + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_related'", 'null': 'True', 'to': "orm['photologue.PhotoEffect']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}), + 'title_slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + 'photologue.photoeffect': { + 'Meta': {'object_name': 'PhotoEffect'}, + 'background_color': ('django.db.models.fields.CharField', [], {'default': "'#FFFFFF'", 'max_length': '7'}), + 'brightness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'color': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'contrast': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'filters': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'reflection_size': ('django.db.models.fields.FloatField', [], {'default': '0'}), + 'reflection_strength': ('django.db.models.fields.FloatField', [], {'default': '0.6'}), + 'sharpness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'transpose_method': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'}) + }, + 'photologue.photosize': { + 'Meta': {'ordering': "['width', 'height']", 'object_name': 'PhotoSize'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_sizes'", 'null': 'True', 'to': "orm['photologue.PhotoEffect']"}), + 'height': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'increment_count': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}), + 'pre_cache': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'quality': ('django.db.models.fields.PositiveIntegerField', [], {'default': '70'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'watermark': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_sizes'", 'null': 'True', 'to': "orm['photologue.Watermark']"}), + 'width': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + 'photologue.watermark': { + 'Meta': {'object_name': 'Watermark'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'opacity': ('django.db.models.fields.FloatField', [], {'default': '1'}), + 'style': ('django.db.models.fields.CharField', [], {'default': "'scale'", 'max_length': '5'}) + } + } + + complete_apps = ['photologue'] diff --git a/photologue/south_migrations/0003_auto__chg_field_photosize_name.py b/photologue/south_migrations/0003_auto__chg_field_photosize_name.py new file mode 100644 index 00000000..e125ce80 --- /dev/null +++ b/photologue/south_migrations/0003_auto__chg_field_photosize_name.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Changing field 'PhotoSize.name' + db.alter_column('photologue_photosize', 'name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=40)) + + def backwards(self, orm): + + # Changing field 'PhotoSize.name' + db.alter_column('photologue_photosize', 'name', self.gf('django.db.models.fields.CharField')(max_length=20, unique=True)) + + models = { + 'photologue.gallery': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Gallery'}, + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'photos': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'galleries'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['photologue.Photo']"}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}), + 'title_slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}) + }, + 'photologue.galleryupload': { + 'Meta': {'object_name': 'GalleryUpload'}, + 'caption': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gallery': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['photologue.Gallery']", 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'tags': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'zip_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}) + }, + 'photologue.photo': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Photo'}, + 'caption': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'crop_from': ('django.db.models.fields.CharField', [], {'default': "'center'", 'max_length': '10', 'blank': 'True'}), + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_related'", 'null': 'True', 'to': "orm['photologue.PhotoEffect']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}), + 'title_slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + 'photologue.photoeffect': { + 'Meta': {'object_name': 'PhotoEffect'}, + 'background_color': ('django.db.models.fields.CharField', [], {'default': "'#FFFFFF'", 'max_length': '7'}), + 'brightness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'color': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'contrast': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'filters': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'reflection_size': ('django.db.models.fields.FloatField', [], {'default': '0'}), + 'reflection_strength': ('django.db.models.fields.FloatField', [], {'default': '0.6'}), + 'sharpness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'transpose_method': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'}) + }, + 'photologue.photosize': { + 'Meta': {'ordering': "['width', 'height']", 'object_name': 'PhotoSize'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_sizes'", 'null': 'True', 'to': "orm['photologue.PhotoEffect']"}), + 'height': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'increment_count': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), + 'pre_cache': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'quality': ('django.db.models.fields.PositiveIntegerField', [], {'default': '70'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'watermark': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_sizes'", 'null': 'True', 'to': "orm['photologue.Watermark']"}), + 'width': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + 'photologue.watermark': { + 'Meta': {'object_name': 'Watermark'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'opacity': ('django.db.models.fields.FloatField', [], {'default': '1'}), + 'style': ('django.db.models.fields.CharField', [], {'default': "'scale'", 'max_length': '5'}) + } + } + + complete_apps = ['photologue'] \ No newline at end of file diff --git a/photologue/south_migrations/0004_initial_photosizes.py b/photologue/south_migrations/0004_initial_photosizes.py new file mode 100644 index 00000000..7743976a --- /dev/null +++ b/photologue/south_migrations/0004_initial_photosizes.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models + +class Migration(DataMigration): + + def forwards(self, orm): + "Write your forwards methods here." + + # If there are already Photosizes, then we are upgrading an existing + # installation, we don't want to auto-create some PhotoSizes. + if orm.PhotoSize.objects.all().count() > 0: + return + print('Creating some default PhotoSizes.') + orm.Photosize.objects.create(name='admin_thumbnail', + width=100, + height=75, + crop=True, + pre_cache=True, + increment_count=True) + orm.Photosize.objects.create(name='thumbnail', + width=100, + height=75, + crop=True, + pre_cache=True, + increment_count=True) + orm.Photosize.objects.create(name='display', + width=400, + crop=False, + pre_cache=True, + increment_count=True) + + + def backwards(self, orm): + "Write your backwards methods here." + print('No backwards data migration possible - we have no way of knowing' + ' if we are dealing with auto-generated or user-entered data.') + + models = { + u'photologue.gallery': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Gallery'}, + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'photos': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'galleries'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['photologue.Photo']"}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}), + 'title_slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}) + }, + u'photologue.galleryupload': { + 'Meta': {'object_name': 'GalleryUpload'}, + 'caption': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gallery': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['photologue.Gallery']", 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'tags': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'zip_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}) + }, + u'photologue.photo': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Photo'}, + 'caption': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'crop_from': ('django.db.models.fields.CharField', [], {'default': "'center'", 'max_length': '10', 'blank': 'True'}), + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_related'", 'null': 'True', 'to': u"orm['photologue.PhotoEffect']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}), + 'title_slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + u'photologue.photoeffect': { + 'Meta': {'object_name': 'PhotoEffect'}, + 'background_color': ('django.db.models.fields.CharField', [], {'default': "'#FFFFFF'", 'max_length': '7'}), + 'brightness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'color': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'contrast': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'filters': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'reflection_size': ('django.db.models.fields.FloatField', [], {'default': '0'}), + 'reflection_strength': ('django.db.models.fields.FloatField', [], {'default': '0.6'}), + 'sharpness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'transpose_method': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'}) + }, + u'photologue.photosize': { + 'Meta': {'ordering': "['width', 'height']", 'object_name': 'PhotoSize'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_sizes'", 'null': 'True', 'to': u"orm['photologue.PhotoEffect']"}), + 'height': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'increment_count': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), + 'pre_cache': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'quality': ('django.db.models.fields.PositiveIntegerField', [], {'default': '70'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'watermark': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_sizes'", 'null': 'True', 'to': u"orm['photologue.Watermark']"}), + 'width': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + u'photologue.watermark': { + 'Meta': {'object_name': 'Watermark'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'opacity': ('django.db.models.fields.FloatField', [], {'default': '1'}), + 'style': ('django.db.models.fields.CharField', [], {'default': "'scale'", 'max_length': '5'}) + } + } + + complete_apps = ['photologue'] + symmetrical = True diff --git a/photologue/south_migrations/0005_auto_28.py b/photologue/south_migrations/0005_auto_28.py new file mode 100644 index 00000000..5cbc72d1 --- /dev/null +++ b/photologue/south_migrations/0005_auto_28.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Sorted M2M. + db.add_column(u'photologue_gallery_photos', 'sort_value', + self.gf('django.db.models.fields.IntegerField')(default=1), + keep_default=False) + + # Rename slug. + db.rename_column('photologue_gallery', 'title_slug', 'slug') + db.rename_column('photologue_photo', 'title_slug', 'slug') + + # Adding M2M table for field sites on 'Gallery' + m2m_table_name = db.shorten_name(u'photologue_gallery_sites') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('gallery', models.ForeignKey(orm[u'photologue.gallery'], null=False)), + ('site', models.ForeignKey(orm[u'sites.site'], null=False)) + )) + db.create_unique(m2m_table_name, ['gallery_id', 'site_id']) + + # Adding M2M table for field sites on 'Photo' + m2m_table_name = db.shorten_name(u'photologue_photo_sites') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('photo', models.ForeignKey(orm[u'photologue.photo'], null=False)), + ('site', models.ForeignKey(orm[u'sites.site'], null=False)) + )) + db.create_unique(m2m_table_name, ['photo_id', 'site_id']) + + def backwards(self, orm): + # Sorted M2M. + db.delete_column(u'photologue_gallery_photos', 'sort_value') + + # Rename slug. + db.rename_column('photologue_gallery', 'slug', 'title_slug') + db.rename_column('photologue_photo', 'slug', 'title_slug') + + # Removing M2M table for field sites on 'Gallery' + db.delete_table(db.shorten_name(u'photologue_gallery_sites')) + + # Removing M2M table for field sites on 'Photo' + db.delete_table(db.shorten_name(u'photologue_photo_sites')) + + models = { + u'photologue.gallery': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Gallery'}, + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'photos': ('sortedm2m.fields.SortedManyToManyField', [], {'blank': 'True', 'related_name': "'galleries'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['photologue.Photo']"}), + 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['sites.Site']", 'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}) + }, + u'photologue.galleryupload': { + 'Meta': {'object_name': 'GalleryUpload'}, + 'caption': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gallery': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['photologue.Gallery']", 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'tags': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'zip_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}) + }, + u'photologue.photo': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Photo'}, + 'caption': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'crop_from': ('django.db.models.fields.CharField', [], {'default': "'center'", 'max_length': '10', 'blank': 'True'}), + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_related'", 'null': 'True', 'to': u"orm['photologue.PhotoEffect']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['sites.Site']", 'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}), + 'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + u'photologue.photoeffect': { + 'Meta': {'object_name': 'PhotoEffect'}, + 'background_color': ('django.db.models.fields.CharField', [], {'default': "'#FFFFFF'", 'max_length': '7'}), + 'brightness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'color': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'contrast': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'filters': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'reflection_size': ('django.db.models.fields.FloatField', [], {'default': '0'}), + 'reflection_strength': ('django.db.models.fields.FloatField', [], {'default': '0.6'}), + 'sharpness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'transpose_method': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'}) + }, + u'photologue.photosize': { + 'Meta': {'ordering': "['width', 'height']", 'object_name': 'PhotoSize'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_sizes'", 'null': 'True', 'to': u"orm['photologue.PhotoEffect']"}), + 'height': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'increment_count': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), + 'pre_cache': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'quality': ('django.db.models.fields.PositiveIntegerField', [], {'default': '70'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'watermark': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_sizes'", 'null': 'True', 'to': u"orm['photologue.Watermark']"}), + 'width': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + u'photologue.watermark': { + 'Meta': {'object_name': 'Watermark'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'opacity': ('django.db.models.fields.FloatField', [], {'default': '1'}), + 'style': ('django.db.models.fields.CharField', [], {'default': "'scale'", 'max_length': '5'}) + }, + u'sites.site': { + 'Meta': {'ordering': "(u'domain',)", 'object_name': 'Site', 'db_table': "u'django_site'"}, + 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + } + } + + complete_apps = ['photologue'] diff --git a/photologue/south_migrations/0006_data_28.py b/photologue/south_migrations/0006_data_28.py new file mode 100644 index 00000000..b17ad4d0 --- /dev/null +++ b/photologue/south_migrations/0006_data_28.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models +from django.conf import settings + +from photologue.models import Gallery, Photo + + +class GalleryPhotoJoin(models.Model): + + """Temp model for representing the join table between Gallery and Photo.""" + id = models.IntegerField() + gallery = models.ForeignKey(Gallery) + photo = models.ForeignKey(Photo) + sort_value = models.IntegerField(default=1) + + class Meta: + db_table = 'photologue_gallery_photos' + managed = False + + +class Migration(DataMigration): + + def forwards(self, orm): + for gallery in orm.Gallery.objects.all(): + counter = 0 + for photo in gallery.photos.all().order_by('-date_added'): + join = GalleryPhotoJoin.objects.get(gallery=gallery, + photo=photo) + join.sort_value = counter + join.save() + counter += 1 + + current_site = orm['sites.Site'].objects.get(pk=settings.SITE_ID) + + for gallery in orm.Gallery.objects.all(): + gallery.sites.add(current_site) + + for photo in orm.Photo.objects.all(): + photo.sites.add(current_site) + + def backwards(self, orm): + raise RuntimeError("Cannot reverse this migration.") + + models = { + u'photologue.gallery': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Gallery'}, + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'photos': ('sortedm2m.fields.SortedManyToManyField', [], {'blank': 'True', 'related_name': "'galleries'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['photologue.Photo']"}), + 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['sites.Site']", 'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}) + }, + u'photologue.galleryupload': { + 'Meta': {'object_name': 'GalleryUpload'}, + 'caption': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gallery': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['photologue.Gallery']", 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'tags': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'zip_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}) + }, + u'photologue.photo': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Photo'}, + 'caption': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'crop_from': ('django.db.models.fields.CharField', [], {'default': "'center'", 'max_length': '10', 'blank': 'True'}), + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_related'", 'null': 'True', 'to': u"orm['photologue.PhotoEffect']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['sites.Site']", 'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}), + 'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + u'photologue.photoeffect': { + 'Meta': {'object_name': 'PhotoEffect'}, + 'background_color': ('django.db.models.fields.CharField', [], {'default': "'#FFFFFF'", 'max_length': '7'}), + 'brightness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'color': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'contrast': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'filters': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'reflection_size': ('django.db.models.fields.FloatField', [], {'default': '0'}), + 'reflection_strength': ('django.db.models.fields.FloatField', [], {'default': '0.6'}), + 'sharpness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'transpose_method': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'}) + }, + u'photologue.photosize': { + 'Meta': {'ordering': "['width', 'height']", 'object_name': 'PhotoSize'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_sizes'", 'null': 'True', 'to': u"orm['photologue.PhotoEffect']"}), + 'height': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'increment_count': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), + 'pre_cache': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'quality': ('django.db.models.fields.PositiveIntegerField', [], {'default': '70'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'watermark': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_sizes'", 'null': 'True', 'to': u"orm['photologue.Watermark']"}), + 'width': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + u'photologue.watermark': { + 'Meta': {'object_name': 'Watermark'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'opacity': ('django.db.models.fields.FloatField', [], {'default': '1'}), + 'style': ('django.db.models.fields.CharField', [], {'default': "'scale'", 'max_length': '5'}) + }, + u'sites.site': { + 'Meta': {'ordering': "(u'domain',)", 'object_name': 'Site', 'db_table': "u'django_site'"}, + 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + } + } + + complete_apps = ['photologue'] + symmetrical = True diff --git a/photologue/south_migrations/0007_auto__chg_field_galleryupload_title.py b/photologue/south_migrations/0007_auto__chg_field_galleryupload_title.py new file mode 100644 index 00000000..8d5f137c --- /dev/null +++ b/photologue/south_migrations/0007_auto__chg_field_galleryupload_title.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Changing field 'GalleryUpload.title' + db.alter_column(u'photologue_galleryupload', 'title', self.gf('django.db.models.fields.CharField')(max_length=50, null=True)) + + def backwards(self, orm): + + # Changing field 'GalleryUpload.title' + db.alter_column(u'photologue_galleryupload', 'title', self.gf('django.db.models.fields.CharField')(default='', max_length=50)) + + models = { + u'photologue.gallery': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Gallery'}, + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'photos': ('sortedm2m.fields.SortedManyToManyField', [], {'blank': 'True', 'related_name': "'galleries'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['photologue.Photo']"}), + 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['sites.Site']", 'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}) + }, + u'photologue.galleryupload': { + 'Meta': {'object_name': 'GalleryUpload'}, + 'caption': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gallery': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['photologue.Gallery']", 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'tags': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'zip_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}) + }, + u'photologue.photo': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Photo'}, + 'caption': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'crop_from': ('django.db.models.fields.CharField', [], {'default': "'center'", 'max_length': '10', 'blank': 'True'}), + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_related'", 'null': 'True', 'to': u"orm['photologue.PhotoEffect']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['sites.Site']", 'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}), + 'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + u'photologue.photoeffect': { + 'Meta': {'object_name': 'PhotoEffect'}, + 'background_color': ('django.db.models.fields.CharField', [], {'default': "'#FFFFFF'", 'max_length': '7'}), + 'brightness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'color': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'contrast': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'filters': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'reflection_size': ('django.db.models.fields.FloatField', [], {'default': '0'}), + 'reflection_strength': ('django.db.models.fields.FloatField', [], {'default': '0.6'}), + 'sharpness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'transpose_method': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'}) + }, + u'photologue.photosize': { + 'Meta': {'ordering': "['width', 'height']", 'object_name': 'PhotoSize'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_sizes'", 'null': 'True', 'to': u"orm['photologue.PhotoEffect']"}), + 'height': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'increment_count': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), + 'pre_cache': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'quality': ('django.db.models.fields.PositiveIntegerField', [], {'default': '70'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'watermark': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_sizes'", 'null': 'True', 'to': u"orm['photologue.Watermark']"}), + 'width': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + u'photologue.watermark': { + 'Meta': {'object_name': 'Watermark'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'opacity': ('django.db.models.fields.FloatField', [], {'default': '1'}), + 'style': ('django.db.models.fields.CharField', [], {'default': "'scale'", 'max_length': '5'}) + }, + u'sites.site': { + 'Meta': {'ordering': "(u'domain',)", 'object_name': 'Site', 'db_table': "u'django_site'"}, + 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + } + } + + complete_apps = ['photologue'] \ No newline at end of file diff --git a/photologue/south_migrations/__init__.py b/photologue/south_migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/photologue/templates/photologue/gallery_archive.html b/photologue/templates/photologue/gallery_archive.html new file mode 100644 index 00000000..3aee09cf --- /dev/null +++ b/photologue/templates/photologue/gallery_archive.html @@ -0,0 +1,35 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% trans "Latest Photo Galleries" %}{% endblock %} + +{% block content %} + +

      + + + +
      + + {% if latest %} + {% for gallery in latest %} + {% include "photologue/includes/gallery_sample.html" %} + {% endfor %} + {% else %} +
      {% trans "No galleries were found" %}.
      + {% endif %} + +
      + +{% endblock %} diff --git a/photologue/templates/photologue/gallery_archive_day.html b/photologue/templates/photologue/gallery_archive_day.html new file mode 100644 index 00000000..c79aa49b --- /dev/null +++ b/photologue/templates/photologue/gallery_archive_day.html @@ -0,0 +1,22 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% blocktrans with show_day=day|date:"d F Y" %}Galleries for {{ show_day }}{% endblocktrans %}{% endblock %} + +{% block content %} + +

      {% blocktrans with show_day=day|date:"d F Y" %}Galleries for {{ show_day }}{% endblocktrans %}

      + + {% if object_list %} + {% for gallery in object_list %} + {% include "photologue/includes/gallery_sample.html" %} + {% endfor %} + {% else %} +
      {% trans "No galleries were found." %}
      + {% endif %} + + + +{% endblock %} diff --git a/photologue/templates/photologue/gallery_archive_month.html b/photologue/templates/photologue/gallery_archive_month.html new file mode 100644 index 00000000..3fc666e4 --- /dev/null +++ b/photologue/templates/photologue/gallery_archive_month.html @@ -0,0 +1,39 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% blocktrans with show_month=month|date:"F Y" %}Galleries for {{ show_month }}{% endblocktrans %}{% endblock %} + +{% block content %} + + + +
      + +
      {% trans "Filter by day" %}
      + + +
      + +
      + + {% if object_list %} + {% for gallery in object_list %} + {% include "photologue/includes/gallery_sample.html" %} + {% endfor %} + {% else %} +
      {% trans "No galleries were found." %}
      + {% endif %} + + + +
      + +{% endblock %} diff --git a/photologue/templates/photologue/gallery_archive_year.html b/photologue/templates/photologue/gallery_archive_year.html new file mode 100644 index 00000000..ccf4bd0d --- /dev/null +++ b/photologue/templates/photologue/gallery_archive_year.html @@ -0,0 +1,39 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% blocktrans with show_year=year|date:"Y" %}Galleries for {{ show_year }}{% endblocktrans %}{% endblock %} + +{% block content %} + + + +
      + +
      {% trans "Filter by month" %}
      + + +
      + +
      + + {% if object_list %} + {% for gallery in object_list %} + {% include "photologue/includes/gallery_sample.html" %} + {% endfor %} + {% else %} +
      {% trans "No galleries were found." %}
      + {% endif %} + + + +
      + +{% endblock %} diff --git a/photologue/templates/photologue/gallery_detail.html b/photologue/templates/photologue/gallery_detail.html new file mode 100644 index 00000000..eea213de --- /dev/null +++ b/photologue/templates/photologue/gallery_detail.html @@ -0,0 +1,24 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{{ gallery.title }}{% endblock %} + +{% block content %} + +
      +
      +

      {{ gallery.title }}

      +

      {% trans "Published" %} {{ gallery.date_added }}

      + {% if gallery.description %}{{ gallery.description|safe }}{% endif %} + + {% for photo in gallery.public %} + + {{ photo.title }} + + {% endfor %} + +

      {% trans "View all galleries" %}

      +
      +
      + +{% endblock %} diff --git a/photologue/templates/photologue/gallery_list.html b/photologue/templates/photologue/gallery_list.html new file mode 100644 index 00000000..34fa4c07 --- /dev/null +++ b/photologue/templates/photologue/gallery_list.html @@ -0,0 +1,35 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% trans "All Galleries" %}{% endblock %} + +{% block content %} + + + + {% if object_list %} + {% for gallery in object_list %} +
      +
      +

      {{ gallery.title }}

      +

      {% trans "Published" %} {{ gallery.date_added }}

      + {% if gallery.description %}

      {{ gallery.description|safe }}

      {% endif %} + {% for photo in gallery.sample %} + + {{ photo.title }} + + {% endfor %} +
      +
      + {% endfor %} + {% else %} +
      {% trans "No galleries were found" %}.
      + {% endif %} + + {% include "photologue/includes/paginator.html" %} + +{% endblock %} diff --git a/photologue/templates/photologue/includes/gallery_sample.html b/photologue/templates/photologue/includes/gallery_sample.html new file mode 100644 index 00000000..336d7ddd --- /dev/null +++ b/photologue/templates/photologue/includes/gallery_sample.html @@ -0,0 +1,17 @@ +{% load i18n %} + +{# Display a randomnly-selected set of photos from a given gallery #} + +
      + +

      {{ gallery.title }}

      +

      {% trans "Published" %} {{ gallery.date_added }}

      + {% if gallery.description %}

      {{ gallery.description|safe }}

      {% endif %} + + {% for photo in gallery.sample %} + + {{ photo.title }} + + {% endfor %} + +
      diff --git a/photologue/templates/photologue/includes/paginator.html b/photologue/templates/photologue/includes/paginator.html new file mode 100644 index 00000000..de983bd8 --- /dev/null +++ b/photologue/templates/photologue/includes/paginator.html @@ -0,0 +1,20 @@ +{% load i18n %} +{% if is_paginated %} + +{% endif %} diff --git a/photologue/templates/photologue/photo_archive.html b/photologue/templates/photologue/photo_archive.html new file mode 100644 index 00000000..ad94c900 --- /dev/null +++ b/photologue/templates/photologue/photo_archive.html @@ -0,0 +1,43 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% trans "Latest Photos" %}{% endblock %} + +{% block content %} + + + +
      + +
      {% trans "Filter by year" %}
      + + +
      + +
      + + {% if latest %} +
      + {% for photo in latest %} + + {{ photo.title }} + + {% endfor %} +
      + {% else %} +
      {% trans "No photos were found" %}.
      + {% endif %} + +
      + +{% endblock %} + + diff --git a/photologue/templates/photologue/photo_archive_day.html b/photologue/templates/photologue/photo_archive_day.html new file mode 100644 index 00000000..9295b49a --- /dev/null +++ b/photologue/templates/photologue/photo_archive_day.html @@ -0,0 +1,26 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% blocktrans with show_day=day|date:"d F Y" %}Photos for {{ show_day }}{% endblocktrans %}{% endblock %} + +{% block content %} + +

      {% blocktrans with show_day=day|date:"d F Y" %}Photos for {{ show_day }}{% endblocktrans %}

      + + {% if object_list %} +
      + {% for photo in object_list %} + + {{ photo.title }} + + {% endfor %} +
      + {% else %} +
      {% trans "No photos were found" %}.
      + {% endif %} + + + +{% endblock %} diff --git a/photologue/templates/photologue/photo_archive_month.html b/photologue/templates/photologue/photo_archive_month.html new file mode 100644 index 00000000..774b6f9a --- /dev/null +++ b/photologue/templates/photologue/photo_archive_month.html @@ -0,0 +1,43 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% blocktrans with show_month=month|date:"F Y" %}Photos for {{ show_month }}{% endblocktrans %}{% endblock %} + +{% block content %} + + + +
      + +
      {% trans "Filter by day" %}
      + + +
      + +
      + + {% if object_list %} +
      + {% for photo in object_list %} + + {{ photo.title }} + + {% endfor %} +
      + {% else %} +
      {% trans "No photos were found" %}.
      + {% endif %} + + + +
      + +{% endblock %} diff --git a/photologue/templates/photologue/photo_archive_year.html b/photologue/templates/photologue/photo_archive_year.html new file mode 100644 index 00000000..53f279c8 --- /dev/null +++ b/photologue/templates/photologue/photo_archive_year.html @@ -0,0 +1,48 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% blocktrans with show_year=year|date:"Y" %}Photos for {{ show_year }}{% endblocktrans %}{% endblock %} + + +{% block content %} + + + +
      + +
      {% trans "Filter by month" %}
      + + +
      + +
      + + {% if object_list %} +
      + {% for photo in object_list %} + + {{ photo.title }} + + {% endfor %} +
      + {% else %} +
      {% trans "No photos were found" %}.
      + {% endif %} + + + +
      + +{% endblock %} + + + + diff --git a/photologue/templates/photologue/photo_detail.html b/photologue/templates/photologue/photo_detail.html new file mode 100644 index 00000000..8f27b440 --- /dev/null +++ b/photologue/templates/photologue/photo_detail.html @@ -0,0 +1,35 @@ +{% extends "photologue/root.html" %} +{% load photologue_tags i18n %} + +{% block title %}{{ object.title }}{% endblock %} + +{% block content %} + +
      +
      +

      {{ object.title }}

      + + {% if object.caption %}

      {{ object.caption|safe }}

      {% endif %} +

      {% trans "Published" %} {{ object.date_added }}

      + + + {{ object.title }} + + + {% if object.public_galleries %} +
      +

      {% trans "This photo is found in the following galleries" %}:

      + + {% for gallery in object.public_galleries %} + + + + + + {% endfor %} +
      {% previous_in_gallery object gallery %}{{ gallery.title }}{% next_in_gallery object gallery %}
      + {% endif %} +
      +
      + +{% endblock %} diff --git a/photologue/templates/photologue/photo_list.html b/photologue/templates/photologue/photo_list.html new file mode 100644 index 00000000..ac1ef214 --- /dev/null +++ b/photologue/templates/photologue/photo_list.html @@ -0,0 +1,28 @@ +{% extends "photologue/root.html" %} +{% load i18n %} + +{% block title %}{% trans "All Photos" %}{% endblock %} + +{% block content %} + + + + {% if object_list %} +
      + {% for photo in object_list %} + + {{ photo.title }} + + {% endfor %} +
      + {% else %} +
      {% trans "No photos were found" %}.
      + {% endif %} + + {% include "photologue/includes/paginator.html" %} + +{% endblock %} diff --git a/photologue/templates/photologue/root.html b/photologue/templates/photologue/root.html new file mode 100644 index 00000000..94d9808c --- /dev/null +++ b/photologue/templates/photologue/root.html @@ -0,0 +1 @@ +{% extends "base.html" %} diff --git a/photologue/templates/photologue/tags/next_in_gallery.html b/photologue/templates/photologue/tags/next_in_gallery.html new file mode 100644 index 00000000..18322e3a --- /dev/null +++ b/photologue/templates/photologue/tags/next_in_gallery.html @@ -0,0 +1,5 @@ +{% if photo %} + + + +{% endif %} \ No newline at end of file diff --git a/photologue/templates/photologue/tags/prev_in_gallery.html b/photologue/templates/photologue/tags/prev_in_gallery.html new file mode 100644 index 00000000..18322e3a --- /dev/null +++ b/photologue/templates/photologue/tags/prev_in_gallery.html @@ -0,0 +1,5 @@ +{% if photo %} + + + +{% endif %} \ No newline at end of file diff --git a/photologue/templatetags/__init__.py b/photologue/templatetags/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/photologue/templatetags/photologue_tags.py b/photologue/templatetags/photologue_tags.py new file mode 100644 index 00000000..018fa378 --- /dev/null +++ b/photologue/templatetags/photologue_tags.py @@ -0,0 +1,129 @@ +import random +from django import template + +register = template.Library() + +from ..models import Gallery +from ..models import Photo + + +@register.inclusion_tag('photologue/tags/next_in_gallery.html') +def next_in_gallery(photo, gallery): + return {'photo': photo.get_next_in_gallery(gallery)} + + +@register.inclusion_tag('photologue/tags/prev_in_gallery.html') +def previous_in_gallery(photo, gallery): + return {'photo': photo.get_previous_in_gallery(gallery)} + + +@register.simple_tag +def cycle_lite_gallery(gallery_title, height, width): + """Generate image tags for jquery slideshow gallery. + See http://malsup.com/jquery/cycle/lite/""" + html = "" + first = 'class="first"' + for p in Gallery.objects.get(title=gallery_title).public(): + html += u'%s' % ( + p.get_display_url(), p.title, height, width, first) + first = None + return html + + +@register.tag +def get_photo(parser, token): + """Get a single photo from the photologue library and return the img tag to display it. + + Takes 3 args: + - the photo to display. This can be either the slug of a photo, or a variable that holds either a photo instance or a integer (photo id) + - the photosize to use. + - a CSS class to apply to the img tag. + """ + try: + # Split the contents of the tag, i.e. tag name + argument. + tag_name, photo, photosize, css_class = token.split_contents() + except ValueError: + msg = '%r tag requires 3 arguments' % token.contents[0] + raise template.TemplateSyntaxError(msg) + return PhotoNode(photo, photosize[1:-1], css_class[1:-1]) + + +class PhotoNode(template.Node): + + def __init__(self, photo, photosize, css_class): + self.photo = photo + self.photosize = photosize + self.css_class = css_class + + def render(self, context): + try: + a = template.resolve_variable(self.photo, context) + except: + a = self.photo + if isinstance(a, Photo): + p = a + else: + try: + p = Photo.objects.get(slug=a) + except Photo.DoesNotExist: + # Ooops. Fail silently + return None + if not p.is_public: + return None + func = getattr(p, 'get_%s_url' % (self.photosize), None) + if func is None: + return 'A "%s" photo size has not been defined.' % (self.photosize) + else: + return u'%s' % (self.css_class, func(), p.title) + + +@register.tag +def get_rotating_photo(parser, token): + """Pick at random a photo from a given photologue gallery and return the img tag to display it. + + Takes 3 args: + - the gallery to pick a photo from. This can be either the slug of a gallery, or a variable that holds either a gallery instance or a gallery slug. + - the photosize to use. + - a CSS class to apply to the img tag. + """ + try: + # Split the contents of the tag, i.e. tag name + argument. + tag_name, gallery, photosize, css_class = token.split_contents() + except ValueError: + msg = '%r tag requires 3 arguments' % token.contents[0] + raise template.TemplateSyntaxError(msg) + return PhotoGalleryNode(gallery, photosize[1:-1], css_class[1:-1]) + + +class PhotoGalleryNode(template.Node): + + def __init__(self, gallery, photosize, css_class): + self.gallery = gallery + self.photosize = photosize + self.css_class = css_class + + def render(self, context): + try: + a = template.resolve_variable(self.gallery, context) + except: + a = self.gallery + if isinstance(a, Gallery): + g = a + else: + try: + g = Gallery.objects.get(slug=a) + except Gallery.DoesNotExist: + return None + photos = g.public() + if len(photos) > 1: + r = random.randint(0, len(photos) - 1) + p = photos[r] + elif len(photos) == 1: + p = photos[0] + else: + return None + func = getattr(p, 'get_%s_url' % (self.photosize), None) + if func is None: + return 'A "%s" photo size has not been defined.' % (self.photosize) + else: + return u'%s' % (self.css_class, func(), p.title) diff --git a/photologue/tests/__init__.py b/photologue/tests/__init__.py new file mode 100644 index 00000000..126b20ab --- /dev/null +++ b/photologue/tests/__init__.py @@ -0,0 +1,9 @@ +from photologue.tests.test_effect import * +from photologue.tests.test_gallery import * +from photologue.tests.test_photo import * +from photologue.tests.test_photosize import * +from photologue.tests.test_resize import * +from photologue.tests.test_views_photo import * +from photologue.tests.test_views_gallery import * +from photologue.tests.test_sitemap import * +from photologue.tests.test_zipupload import * diff --git a/photologue/tests/factories.py b/photologue/tests/factories.py new file mode 100644 index 00000000..1abf8bf3 --- /dev/null +++ b/photologue/tests/factories.py @@ -0,0 +1,109 @@ +import os +import datetime +try: + from django.utils.text import slugify +except ImportError: + # Django 1.4 + from django.template.defaultfilters import slugify +from django.utils.timezone import utc +from django.utils import six +from django.conf import settings +try: + import factory +except ImportError: + raise ImportError( + "No module named factory. To run photologue's tests you need to install factory-boy.") + +from ..models import Gallery, ImageModel, Photo, PhotoSize + +RES_DIR = os.path.join(os.path.dirname(__file__), '../res') +LANDSCAPE_IMAGE_PATH = os.path.join(RES_DIR, 'test_photologue_landscape.jpg') +PORTRAIT_IMAGE_PATH = os.path.join(RES_DIR, 'test_photologue_portrait.jpg') +SQUARE_IMAGE_PATH = os.path.join(RES_DIR, 'test_photologue_square.jpg') +QUOTING_IMAGE_PATH = os.path.join(RES_DIR, 'test_photologue_"ing.jpg') +SAMPLE_ZIP_PATH = os.path.join(RES_DIR, 'zips/sample.zip') +SAMPLE_NOT_IMAGE_ZIP_PATH = os.path.join(RES_DIR, 'zips/not_image.zip') +IGNORED_FILES_ZIP_PATH = os.path.join(RES_DIR, 'zips/ignored_files.zip') + + +class GalleryFactory(factory.django.DjangoModelFactory): + + FACTORY_FOR = Gallery + + title = factory.Sequence(lambda n: 'gallery{0:0>3}'.format(n)) + slug = factory.LazyAttribute(lambda a: slugify(six.text_type(a.title))) + + @factory.sequence + def date_added(n): + # Have to cater projects being non-timezone aware. + if settings.USE_TZ: + sample_date = datetime.datetime( + year=2011, month=12, day=23, hour=17, minute=40, tzinfo=utc) + else: + sample_date = datetime.datetime(year=2011, month=12, day=23, hour=17, minute=40) + return sample_date + datetime.timedelta(minutes=n) + + @factory.post_generation + def sites(self, create, extracted, **kwargs): + """ + Associates the object with the current site unless ``sites`` was passed, + in which case the each item in ``sites`` is associated with the object. + + Note that if PHOTOLOGUE_MULTISITE is False, all Gallery/Photos are automatically + associated with the current site - bear this in mind when writing tests. + """ + if not create: + return + if extracted: + for site in extracted: + self.sites.add(site) + + +class ImageModelFactory(factory.django.DjangoModelFactory): + FACTORY_FOR = ImageModel + ABSTRACT_FACTORY = True + + +class PhotoFactory(ImageModelFactory): + + """Note: after creating Photo instances for tests, remember to manually + delete them. + """ + + FACTORY_FOR = Photo + + title = factory.Sequence(lambda n: 'photo{0:0>3}'.format(n)) + slug = factory.LazyAttribute(lambda a: slugify(six.text_type(a.title))) + image = factory.django.ImageField(from_path=LANDSCAPE_IMAGE_PATH) + + @factory.sequence + def date_added(n): + # Have to cater projects being non-timezone aware. + if settings.USE_TZ: + sample_date = datetime.datetime( + year=2011, month=12, day=23, hour=17, minute=40, tzinfo=utc) + else: + sample_date = datetime.datetime(year=2011, month=12, day=23, hour=17, minute=40) + return sample_date + datetime.timedelta(minutes=n) + + @factory.post_generation + def sites(self, create, extracted, **kwargs): + """ + Associates the object with the current site unless ``sites`` was passed, + in which case the each item in ``sites`` is associated with the object. + + Note that if PHOTOLOGUE_MULTISITE is False, all Gallery/Photos are automatically + associated with the current site - bear this in mind when writing tests. + """ + if not create: + return + if extracted: + for site in extracted: + self.sites.add(site) + + +class PhotoSizeFactory(factory.django.DjangoModelFactory): + + FACTORY_FOR = PhotoSize + + name = factory.Sequence(lambda n: 'name{0:0>3}'.format(n)) diff --git a/photologue/tests/helpers.py b/photologue/tests/helpers.py new file mode 100644 index 00000000..b50ec328 --- /dev/null +++ b/photologue/tests/helpers.py @@ -0,0 +1,16 @@ +from django.test import TestCase +from .factories import PhotoFactory, PhotoSizeFactory + + +class PhotologueBaseTest(TestCase): + + def setUp(self): + self.s = PhotoSizeFactory(name='testPhotoSize', + width=100, + height=100) + self.pl = PhotoFactory(title='Landscape', + slug='landscape') + + def tearDown(self): + # Need to manually remove the files created during testing. + self.pl.delete() diff --git a/photologue/tests/templates/base.html b/photologue/tests/templates/base.html new file mode 100644 index 00000000..e69de29b diff --git a/photologue/tests/test_effect.py b/photologue/tests/test_effect.py new file mode 100644 index 00000000..987c97ad --- /dev/null +++ b/photologue/tests/test_effect.py @@ -0,0 +1,12 @@ +from ..models import Image, PhotoEffect +from .helpers import PhotologueBaseTest + + +class PhotoEffectTest(PhotologueBaseTest): + + def test(self): + effect = PhotoEffect(name='test') + im = Image.open(self.pl.image.storage.open(self.pl.image.name)) + self.assertIsInstance(effect.pre_process(im), Image.Image) + self.assertIsInstance(effect.post_process(im), Image.Image) + self.assertIsInstance(effect.process(im), Image.Image) diff --git a/photologue/tests/test_gallery.py b/photologue/tests/test_gallery.py new file mode 100644 index 00000000..23f94536 --- /dev/null +++ b/photologue/tests/test_gallery.py @@ -0,0 +1,63 @@ +from .. import models +from .helpers import PhotologueBaseTest +from .factories import GalleryFactory, PhotoFactory + + +class GalleryTest(PhotologueBaseTest): + + def setUp(self): + """Create a test gallery with 2 photos.""" + super(GalleryTest, self).setUp() + self.test_gallery = GalleryFactory() + self.pl2 = PhotoFactory() + self.test_gallery.photos.add(self.pl) + self.test_gallery.photos.add(self.pl2) + + def tearDown(self): + super(GalleryTest, self).tearDown() + self.pl2.delete() + + def test_public(self): + """Method 'public' should only return photos flagged as public.""" + self.assertEqual(self.test_gallery.public().count(), 2) + self.pl.is_public = False + self.pl.save() + self.assertEqual(self.test_gallery.public().count(), 1) + + def test_photo_count(self): + """Method 'photo_count' should return the count of the photos in this + gallery.""" + self.assertEqual(self.test_gallery.photo_count(), 2) + self.pl.is_public = False + self.pl.save() + self.assertEqual(self.test_gallery.photo_count(), 1) + + # Method takes an optional 'public' kwarg. + self.assertEqual(self.test_gallery.photo_count(public=False), 2) + + def test_sample(self): + """Method 'sample' should return a random queryset of photos from the + gallery.""" + + # By default we return all photos from the gallery (but ordered at random). + _current_sample_size = models.SAMPLE_SIZE + models.SAMPLE_SIZE = 5 + self.assertEqual(len(self.test_gallery.sample()), 2) + + # We can state how many photos we want. + self.assertEqual(len(self.test_gallery.sample(count=1)), 1) + + # If only one photo is public then the sample cannot have more than one + # photo. + self.pl.is_public = False + self.pl.save() + self.assertEqual(len(self.test_gallery.sample(count=2)), 1) + + self.pl.is_public = True + self.pl.save() + + # We can limit the number of photos by changing settings. + models.SAMPLE_SIZE = 1 + self.assertEqual(len(self.test_gallery.sample()), 1) + + models.SAMPLE_SIZE = _current_sample_size diff --git a/photologue/tests/test_photo.py b/photologue/tests/test_photo.py new file mode 100644 index 00000000..a9b8da80 --- /dev/null +++ b/photologue/tests/test_photo.py @@ -0,0 +1,194 @@ +import os +from django.conf import settings +from ..models import Image, Photo, PHOTOLOGUE_DIR +from .factories import LANDSCAPE_IMAGE_PATH, QUOTING_IMAGE_PATH, \ + GalleryFactory, PhotoFactory +from .helpers import PhotologueBaseTest + + +class PhotoTest(PhotologueBaseTest): + + def tearDown(self): + """Delete any extra test files (if created).""" + super(PhotoTest, self).tearDown() + try: + self.pl2.delete() + except: + pass + + def test_new_photo(self): + self.assertEqual(Photo.objects.count(), 1) + self.assertTrue(self.pl.image.storage.exists(self.pl.image.name)) + self.assertEqual(self.pl.image.storage.size(self.pl.image.name), + os.path.getsize(LANDSCAPE_IMAGE_PATH)) + + # def test_exif(self): + # self.assertTrue(len(self.pl.EXIF.keys()) > 0) + + def test_paths(self): + self.assertEqual(os.path.normpath(str(self.pl.cache_path())).lower(), + os.path.normpath(os.path.join(PHOTOLOGUE_DIR, + 'photos', + 'cache')).lower()) + self.assertEqual(self.pl.cache_url(), + settings.MEDIA_URL + PHOTOLOGUE_DIR + '/photos/cache') + + def test_count(self): + for i in range(5): + self.pl.get_testPhotoSize_url() + self.assertEqual(self.pl.view_count, 0) + self.s.increment_count = True + self.s.save() + for i in range(5): + self.pl.get_testPhotoSize_url() + self.assertEqual(self.pl.view_count, 5) + + def test_precache(self): + # set the thumbnail photo size to pre-cache + self.s.pre_cache = True + self.s.save() + # make sure it created the file + self.assertTrue(self.pl.image.storage.exists( + self.pl.get_testPhotoSize_filename())) + self.s.pre_cache = False + self.s.save() + # clear the cache and make sure the file's deleted + self.pl.clear_cache() + self.assertFalse(self.pl.image.storage.exists( + self.pl.get_testPhotoSize_filename())) + + def test_accessor_methods(self): + self.assertEqual(self.pl.get_testPhotoSize_photosize(), self.s) + self.assertEqual(self.pl.get_testPhotoSize_size(), + Image.open(self.pl.image.storage.open( + self.pl.get_testPhotoSize_filename())).size) + self.assertEqual(self.pl.get_testPhotoSize_url(), + self.pl.cache_url() + '/' + + self.pl._get_filename_for_size(self.s)) + self.assertEqual(self.pl.get_testPhotoSize_filename(), + os.path.join(self.pl.cache_path(), + self.pl._get_filename_for_size(self.s))) + + def test_quoted_url(self): + """Test for issue #29 - filenames of photos are incorrectly quoted when + building a URL.""" + + # Check that a 'normal' path works ok. + self.assertEqual(self.pl.get_testPhotoSize_url(), + self.pl.cache_url() + '/test_photologue_landscape_testPhotoSize.jpg') + + # Now create a Photo with a name that needs quoting. + self.pl2 = PhotoFactory(image__from_path=QUOTING_IMAGE_PATH) + self.assertEqual(self.pl2.get_testPhotoSize_url(), + self.pl2.cache_url() + '/test_photologue_%26quoting_testPhotoSize.jpg') + + +class PhotoManagerTest(PhotologueBaseTest): + + """Some tests for the methods on the Photo manager class.""" + + def setUp(self): + """Create 2 photos.""" + super(PhotoManagerTest, self).setUp() + self.pl2 = PhotoFactory() + + def tearDown(self): + super(PhotoManagerTest, self).tearDown() + self.pl2.delete() + + def test_public(self): + """Method 'is_public' should only return photos flagged as public.""" + self.assertEqual(Photo.objects.is_public().count(), 2) + self.pl.is_public = False + self.pl.save() + self.assertEqual(Photo.objects.is_public().count(), 1) + + +class PreviousNextTest(PhotologueBaseTest): + + """Tests for the methods that provide the previous/next photos in a gallery.""" + + def setUp(self): + """Create a test gallery with 2 photos.""" + super(PreviousNextTest, self).setUp() + self.test_gallery = GalleryFactory() + self.pl1 = PhotoFactory() + self.pl2 = PhotoFactory() + self.pl3 = PhotoFactory() + self.test_gallery.photos.add(self.pl1) + self.test_gallery.photos.add(self.pl2) + self.test_gallery.photos.add(self.pl3) + + def tearDown(self): + super(PreviousNextTest, self).tearDown() + self.pl1.delete() + self.pl2.delete() + self.pl3.delete() + + def test_previous_simple(self): + # Previous in gallery. + self.assertEqual(self.pl1.get_previous_in_gallery(self.test_gallery), + None) + self.assertEqual(self.pl2.get_previous_in_gallery(self.test_gallery), + self.pl1) + self.assertEqual(self.pl3.get_previous_in_gallery(self.test_gallery), + self.pl2) + + def test_previous_public(self): + """What happens if one of the photos is not public.""" + self.pl2.is_public = False + self.pl2.save() + + self.assertEqual(self.pl1.get_previous_in_gallery(self.test_gallery), + None) + self.assertRaisesMessage(ValueError, + 'Cannot determine neighbours of a non-public photo.', + self.pl2.get_previous_in_gallery, + self.test_gallery) + self.assertEqual(self.pl3.get_previous_in_gallery(self.test_gallery), + self.pl1) + + def test_previous_gallery_mismatch(self): + """Photo does not belong to the gallery.""" + self.pl4 = PhotoFactory() + + self.assertRaisesMessage(ValueError, + 'Photo does not belong to gallery.', + self.pl4.get_previous_in_gallery, + self.test_gallery) + + self.pl4.delete() + + def test_next_simple(self): + # Next in gallery. + self.assertEqual(self.pl1.get_next_in_gallery(self.test_gallery), + self.pl2) + self.assertEqual(self.pl2.get_next_in_gallery(self.test_gallery), + self.pl3) + self.assertEqual(self.pl3.get_next_in_gallery(self.test_gallery), + None) + + def test_next_public(self): + """What happens if one of the photos is not public.""" + self.pl2.is_public = False + self.pl2.save() + + self.assertEqual(self.pl1.get_next_in_gallery(self.test_gallery), + self.pl3) + self.assertRaisesMessage(ValueError, + 'Cannot determine neighbours of a non-public photo.', + self.pl2.get_next_in_gallery, + self.test_gallery) + self.assertEqual(self.pl3.get_next_in_gallery(self.test_gallery), + None) + + def test_next_gallery_mismatch(self): + """Photo does not belong to the gallery.""" + self.pl4 = PhotoFactory() + + self.assertRaisesMessage(ValueError, + 'Photo does not belong to gallery.', + self.pl4.get_next_in_gallery, + self.test_gallery) + + self.pl4.delete() diff --git a/photologue/tests/test_photosize.py b/photologue/tests/test_photosize.py new file mode 100644 index 00000000..47da0ff2 --- /dev/null +++ b/photologue/tests/test_photosize.py @@ -0,0 +1,30 @@ +from django.core.exceptions import ValidationError + +from .factories import PhotoSizeFactory +from .helpers import PhotologueBaseTest + + +class PhotoSizeNameTest(PhotologueBaseTest): + + + def test_valid_name(self): + """We are restricted in what names we can enter.""" + + photosize = PhotoSizeFactory() + photosize.name = None + with self.assertRaisesMessage(ValidationError, 'This field cannot be null.'): + photosize.full_clean() + + photosize = PhotoSizeFactory(name='') + with self.assertRaisesMessage(ValidationError, 'This field cannot be blank.'): + photosize.full_clean() + + for name in ('a space', 'UPPERCASE', 'bad?chars'): + photosize = PhotoSizeFactory(name=name) + with self.assertRaisesMessage(ValidationError, 'Use only plain lowercase letters (ASCII), numbers and underscores.'): + photosize.full_clean() + + for name in ('label', '2_words'): + photosize = PhotoSizeFactory(name=name) + photosize.full_clean() + diff --git a/photologue/tests/test_resize.py b/photologue/tests/test_resize.py new file mode 100644 index 00000000..5965fecd --- /dev/null +++ b/photologue/tests/test_resize.py @@ -0,0 +1,132 @@ +import unittest +from django.core.exceptions import ValidationError +from ..models import PhotoSizeCache, PhotoSize +from .helpers import PhotologueBaseTest +from .factories import SQUARE_IMAGE_PATH, PORTRAIT_IMAGE_PATH, PhotoFactory + + +class PhotoSizeTest(unittest.TestCase): + + def test_clean_wont_allow_zero_dimension_and_crop(self): + """Tests if ValidationError is raised by clean method if with or height + is set to 0 and crop is set to true""" + s = PhotoSize(name='test', width=400, crop=True) + self.assertRaises(ValidationError, s.clean) + + +class ImageResizeTest(PhotologueBaseTest): + + def setUp(self): + super(ImageResizeTest, self).setUp() + # Portrait. + self.pp = PhotoFactory(image__from_path=PORTRAIT_IMAGE_PATH) + # Square. + self.ps = PhotoFactory(image__from_path=SQUARE_IMAGE_PATH) + + def tearDown(self): + super(ImageResizeTest, self).tearDown() + self.pp.delete() + self.ps.delete() + + def test_resize_to_fit(self): + self.assertEqual(self.pl.get_testPhotoSize_size(), (100, 75)) + self.assertEqual(self.pp.get_testPhotoSize_size(), (75, 100)) + self.assertEqual(self.ps.get_testPhotoSize_size(), (100, 100)) + + def test_resize_to_fit_width(self): + self.s.size = (100, 0) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (100, 75)) + self.assertEqual(self.pp.get_testPhotoSize_size(), (100, 133)) + self.assertEqual(self.ps.get_testPhotoSize_size(), (100, 100)) + + def test_resize_to_fit_width_enlarge(self): + self.s.size = (400, 0) + self.s.upscale = True + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (400, 300)) + self.assertEqual(self.pp.get_testPhotoSize_size(), (400, 533)) + self.assertEqual(self.ps.get_testPhotoSize_size(), (400, 400)) + + def test_resize_to_fit_height(self): + self.s.size = (0, 100) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (133, 100)) + self.assertEqual(self.pp.get_testPhotoSize_size(), (75, 100)) + self.assertEqual(self.ps.get_testPhotoSize_size(), (100, 100)) + + def test_resize_to_fit_height_enlarge(self): + self.s.size = (0, 400) + self.s.upscale = True + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (533, 400)) + self.assertEqual(self.pp.get_testPhotoSize_size(), (300, 400)) + self.assertEqual(self.ps.get_testPhotoSize_size(), (400, 400)) + + def test_resize_and_crop(self): + self.s.crop = True + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), self.s.size) + self.assertEqual(self.pp.get_testPhotoSize_size(), self.s.size) + self.assertEqual(self.ps.get_testPhotoSize_size(), self.s.size) + + def test_resize_rounding_to_fit(self): + self.s.size = (113, 113) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (113, 85)) + self.assertEqual(self.pp.get_testPhotoSize_size(), (85, 113)) + self.assertEqual(self.ps.get_testPhotoSize_size(), (113, 113)) + + def test_resize_rounding_cropped(self): + self.s.size = (113, 113) + self.s.crop = True + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), self.s.size) + self.assertEqual(self.pp.get_testPhotoSize_size(), self.s.size) + self.assertEqual(self.ps.get_testPhotoSize_size(), self.s.size) + + def test_resize_one_dimension_width(self): + self.s.size = (100, 150) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (100, 75)) + + def test_resize_one_dimension_height(self): + self.s.size = (200, 75) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (100, 75)) + + def test_resize_no_upscale(self): + self.s.size = (1000, 1000) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (200, 150)) + + def test_resize_no_upscale_mixed_height(self): + self.s.size = (400, 75) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (100, 75)) + + def test_resize_no_upscale_mixed_width(self): + self.s.size = (100, 300) + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (100, 75)) + + def test_resize_no_upscale_crop(self): + self.s.size = (1000, 1000) + self.s.crop = True + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (1000, 1000)) + + def test_resize_upscale(self): + self.s.size = (1000, 1000) + self.s.upscale = True + self.s.save() + self.assertEqual(self.pl.get_testPhotoSize_size(), (1000, 750)) + self.assertEqual(self.pp.get_testPhotoSize_size(), (750, 1000)) + self.assertEqual(self.ps.get_testPhotoSize_size(), (1000, 1000)) + + +class PhotoSizeCacheTest(PhotologueBaseTest): + + def test(self): + cache = PhotoSizeCache() + self.assertEqual(cache.sizes['testPhotoSize'], self.s) diff --git a/photologue/tests/test_sitemap.py b/photologue/tests/test_sitemap.py new file mode 100644 index 00000000..f31942c1 --- /dev/null +++ b/photologue/tests/test_sitemap.py @@ -0,0 +1,29 @@ +from django.conf import settings +from django.utils import unittest + +from .helpers import PhotologueBaseTest +from .factories import GalleryFactory + + +@unittest.skipUnless('django.contrib.sitemaps' in settings.INSTALLED_APPS, + 'Sitemaps not installed in this project, nothing to test.') +class SitemapTest(PhotologueBaseTest): + + urls = 'photologue.tests.test_urls' + + def test_get_photo(self): + """Default test setup contains one photo, this should appear in the sitemap.""" + response = self.client.get('/sitemap.xml') + self.assertContains(response, + 'http://example.com/ptests/photo/landscape/2011-12-230.5') + + def test_get_gallery(self): + """if we add a gallery to the site, we should see both the gallery and + the photo in the sitemap.""" + self.gallery = GalleryFactory(slug='test-gallery') + + response = self.client.get('/sitemap.xml') + self.assertContains(response, + 'http://example.com/ptests/photo/landscape/2011-12-230.5') + self.assertContains(response, + 'http://example.com/ptests/gallery/test-gallery/2011-12-230.5') diff --git a/photologue/tests/test_sites.py b/photologue/tests/test_sites.py new file mode 100644 index 00000000..918d8bd4 --- /dev/null +++ b/photologue/tests/test_sites.py @@ -0,0 +1,115 @@ +from django.test import TestCase +from django.contrib.sites.models import Site + +from .factories import GalleryFactory, PhotoFactory + + +class SitesTest(TestCase): + + urls = 'photologue.tests.test_urls' + + def setUp(self): + """ + Create two example sites that we can use to test what gets displayed + where. + """ + super(SitesTest, self).setUp() + + self.site1, created1 = Site.objects.get_or_create( + domain="example.com", name="example.com") + self.site2, created2 = Site.objects.get_or_create( + domain="example.org", name="example.org") + + with self.settings(PHOTOLOGUE_MULTISITE=True): + # Be explicit about linking Galleries/Photos to Sites.""" + self.gallery1 = GalleryFactory(slug='test-gallery', sites=[self.site1]) + self.gallery2 = GalleryFactory(slug='not-on-site-gallery') + self.photo1 = PhotoFactory(slug='test-photo', sites=[self.site1]) + self.photo2 = PhotoFactory(slug='not-on-site-photo') + self.gallery1.photos.add(self.photo1, self.photo2) + + # I'd like to use factory_boy's mute_signal decorator but that + # will only available once factory_boy 2.4 is released. So long + # we'll have to remove the site association manually + self.photo2.sites.clear() + + def tearDown(self): + super(SitesTest, self).tearDown() + self.gallery1.delete() + self.gallery2.delete() + self.photo1.delete() + self.photo2.delete() + + def test_basics(self): + """ See if objects were added automatically (by the factory) to the current site. """ + self.assertEqual(list(self.gallery1.sites.all()), [self.site1]) + self.assertEqual(list(self.photo1.sites.all()), [self.site1]) + + def test_auto_add_sites(self): + """ + Objects should not be automatically associated with a particular site when + ``PHOTOLOGUE_MULTISITE`` is ``True``. + """ + + with self.settings(PHOTOLOGUE_MULTISITE=False): + gallery = GalleryFactory() + photo = PhotoFactory() + self.assertEqual(list(gallery.sites.all()), [self.site1]) + self.assertEqual(list(photo.sites.all()), [self.site1]) + + photo.delete() + + with self.settings(PHOTOLOGUE_MULTISITE=True): + gallery = GalleryFactory() + photo = PhotoFactory() + self.assertEqual(list(gallery.sites.all()), []) + self.assertEqual(list(photo.sites.all()), []) + + photo.delete() + + def test_gallery_list(self): + response = self.client.get('/ptests/gallerylist/') + self.assertEqual(list(response.context['object_list']), [self.gallery1]) + + def test_gallery_detail(self): + response = self.client.get('/ptests/gallery/test-gallery/') + self.assertEqual(response.context['object'], self.gallery1) + + response = self.client.get('/ptests/gallery/not-on-site-gallery/') + self.assertEqual(response.status_code, 404) + + def test_photo_list(self): + response = self.client.get('/ptests/photolist/') + self.assertEqual(list(response.context['object_list']), [self.photo1]) + + def test_photo_detail(self): + response = self.client.get('/ptests/photo/test-photo/') + self.assertEqual(response.context['object'], self.photo1) + + response = self.client.get('/ptests/photo/not-on-site-photo/') + self.assertEqual(response.status_code, 404) + + def test_photo_archive(self): + response = self.client.get('/ptests/photo/') + self.assertEqual(list(response.context['object_list']), [self.photo1]) + + def test_photos_in_gallery(self): + """ + Only those photos are supposed to be shown in a gallery that are + also associated with the current site. + """ + response = self.client.get('/ptests/gallery/test-gallery/') + self.assertEqual(list(response.context['object'].public()), [self.photo1]) + + def test_orphaned_photos(self): + self.assertEqual(list(self.gallery1.orphaned_photos()), [self.photo2]) + + self.gallery2.photos.add(self.photo2) + self.assertEqual(list(self.gallery1.orphaned_photos()), [self.photo2]) + + self.gallery1.sites.clear() + self.assertEqual(list(self.gallery1.orphaned_photos()), [self.photo1, self.photo2]) + + self.photo1.sites.clear() + self.photo2.sites.clear() + self.assertEqual(list(self.gallery1.orphaned_photos()), [self.photo1, self.photo2]) diff --git a/photologue/tests/test_urls.py b/photologue/tests/test_urls.py new file mode 100644 index 00000000..5daf5c0f --- /dev/null +++ b/photologue/tests/test_urls.py @@ -0,0 +1,15 @@ +from django.conf.urls import * +from ..sitemaps import GallerySitemap, PhotoSitemap + +urlpatterns = patterns('', + (r'^ptests/', include('photologue.urls')), + ) + +sitemaps = {'photologue_galleries': GallerySitemap, + 'photologue_photos': PhotoSitemap, + } + +urlpatterns += patterns('', + (r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': + sitemaps}) + ) diff --git a/photologue/tests/test_views_gallery.py b/photologue/tests/test_views_gallery.py new file mode 100644 index 00000000..ac73a225 --- /dev/null +++ b/photologue/tests/test_views_gallery.py @@ -0,0 +1,90 @@ +from django.test import TestCase +from .factories import GalleryFactory + + +class RequestGalleryTest(TestCase): + + urls = 'photologue.tests.test_urls' + + def setUp(self): + super(RequestGalleryTest, self).setUp() + self.gallery = GalleryFactory(slug='test-gallery') + + def test_archive_gallery_url_works(self): + response = self.client.get('/ptests/gallery/') + self.assertEqual(response.status_code, 200) + + def test_archive_gallery_empty(self): + """If there are no galleries to show, tell the visitor - don't show a + 404.""" + + self.gallery.is_public = False + self.gallery.save() + + response = self.client.get('/ptests/gallery/') + self.assertEqual(response.status_code, 200) + + self.assertEqual(response.context['latest'].count(), + 0) + + def test_paginated_gallery_url_works(self): + response = self.client.get('/ptests/gallerylist/') + self.assertEqual(response.status_code, 200) + + def test_gallery_works(self): + response = self.client.get('/ptests/gallery/test-gallery/') + self.assertEqual(response.status_code, 200) + + def test_archive_year_gallery_works(self): + response = self.client.get('/ptests/gallery/2011/') + self.assertEqual(response.status_code, 200) + + def test_archive_month_gallery_works(self): + response = self.client.get('/ptests/gallery/2011/dec/') + self.assertEqual(response.status_code, 200) + + def test_archive_day_gallery_works(self): + response = self.client.get('/ptests/gallery/2011/dec/23/') + self.assertEqual(response.status_code, 200) + + def test_detail_gallery_works(self): + response = self.client.get('/ptests/gallery/2011/dec/23/test-gallery/') + self.assertEqual(response.status_code, 200) + + def test_redirect_to_list(self): + """Trivial test - if someone requests the root url of the app + (i.e. /ptests/'), redirect them to the gallery list page.""" + response = self.client.get('/ptests/') + self.assertRedirects(response, '/ptests/gallery/', 301, 200) + + +class GalleryPaginationTest(TestCase): + + urls = 'photologue.tests.test_urls' + + def test_pagination(self): + for i in range(1, 23): + GalleryFactory(title='gallery{0:0>3}'.format(i)) + + response = self.client.get('/ptests/gallerylist/') + self.assertEqual(response.status_code, 200) + + self.assertEqual(len(response.context['object_list']), + 20) + # Check first and last items. + self.assertEqual(response.context['object_list'][0].title, + 'gallery022') + self.assertEqual(response.context['object_list'][19].title, + 'gallery003') + + # Now get the second page of results. + response = self.client.get('/ptests/gallerylist/?page=2') + self.assertEqual(response.status_code, 200) + + self.assertEqual(len(response.context['object_list']), + 2) + # Check first and last items. + self.assertEqual(response.context['object_list'][0].title, + 'gallery002') + self.assertEqual(response.context['object_list'][1].title, + 'gallery001') diff --git a/photologue/tests/test_views_photo.py b/photologue/tests/test_views_photo.py new file mode 100644 index 00000000..2a41e58f --- /dev/null +++ b/photologue/tests/test_views_photo.py @@ -0,0 +1,95 @@ +from django.test import TestCase +from .factories import PhotoFactory +from ..models import Photo + + +class RequestPhotoTest(TestCase): + + urls = 'photologue.tests.test_urls' + + def setUp(self): + super(RequestPhotoTest, self).setUp() + self.photo = PhotoFactory(slug='fake-photo') + + def tearDown(self): + super(RequestPhotoTest, self).tearDown() + self.photo.delete() + + def test_archive_photo_url_works(self): + response = self.client.get('/ptests/photo/') + self.assertEqual(response.status_code, 200) + + def test_archive_photo_empty(self): + """If there are no photo to show, tell the visitor - don't show a + 404.""" + + Photo.objects.all().update(is_public=False) + + response = self.client.get('/ptests/photo/') + self.assertEqual(response.status_code, 200) + + self.assertEqual(response.context['latest'].count(), + 0) + + def test_paginated_photo_url_works(self): + response = self.client.get('/ptests/photolist/') + self.assertEqual(response.status_code, 200) + + def test_photo_works(self): + response = self.client.get('/ptests/photo/fake-photo/') + self.assertEqual(response.status_code, 200) + + def test_archive_year_photo_works(self): + response = self.client.get('/ptests/photo/2011/') + self.assertEqual(response.status_code, 200) + + def test_archive_month_photo_works(self): + response = self.client.get('/ptests/photo/2011/dec/') + self.assertEqual(response.status_code, 200) + + def test_archive_day_photo_works(self): + response = self.client.get('/ptests/photo/2011/dec/23/') + self.assertEqual(response.status_code, 200) + + def test_detail_photo_works(self): + response = self.client.get('/ptests/photo/2011/dec/23/fake-photo/') + self.assertEqual(response.status_code, 200) + + +class PhotoPaginationTest(TestCase): + + urls = 'photologue.tests.test_urls' + + def test_pagination(self): + photos = [] + for i in range(1, 23): + photos.append( + PhotoFactory(title='photo{0:0>3}'.format(i)) + ) + + response = self.client.get('/ptests/photolist/') + self.assertEqual(response.status_code, 200) + + self.assertEqual(len(response.context['object_list']), + 20) + # Check first and last items. + self.assertEqual(response.context['object_list'][0].title, + 'photo022') + self.assertEqual(response.context['object_list'][19].title, + 'photo003') + + # Now get the second page of results. + response = self.client.get('/ptests/photolist/?page=2') + self.assertEqual(response.status_code, 200) + + self.assertEqual(len(response.context['object_list']), + 2) + # Check first and last items. + self.assertEqual(response.context['object_list'][0].title, + 'photo002') + self.assertEqual(response.context['object_list'][1].title, + 'photo001') + + # Need to clean up and manually remove all photos. + for photo in photos: + photo.delete() diff --git a/photologue/tests/test_zipupload.py b/photologue/tests/test_zipupload.py new file mode 100644 index 00000000..f76b64f2 --- /dev/null +++ b/photologue/tests/test_zipupload.py @@ -0,0 +1,127 @@ +from django.test import TestCase +from django.core.files import File +from django.core.exceptions import ValidationError + +from ..models import GalleryUpload, Gallery, Photo +from .factories import GalleryFactory, PhotoFactory, SAMPLE_ZIP_PATH, SAMPLE_NOT_IMAGE_ZIP_PATH, \ + IGNORED_FILES_ZIP_PATH + + +class GalleryUploadTest(TestCase): + + def tearDown(self): + super(GalleryUploadTest, self).tearDown() + for photo in Photo.objects.all(): + photo.delete() + + def test_sample(self): + """Upload a zip with a single file it it: 'sample.jpg'. + It gets assigned to a newly created gallery 'Test'.""" + + with open(SAMPLE_ZIP_PATH, mode='rb') as f: + test_file = File(f) + GalleryUpload.objects.create(title='Test', + zip_file=test_file) + + self.assertQuerysetEqual(Gallery.objects.all(), + ['']) + self.assertQuerysetEqual(Photo.objects.all(), + ['']) + + # The photo is attached to the gallery. + gallery = Gallery.objects.get(title='Test') + self.assertQuerysetEqual(gallery.photos.all(), + ['']) + + def test_not_image(self): + """A zip with a file of the wrong format (.txt). + That file gets ignored.""" + + with open(SAMPLE_NOT_IMAGE_ZIP_PATH, mode='rb') as f: + test_file = File(f) + GalleryUpload.objects.create(title='Test', + zip_file=test_file) + + self.assertQuerysetEqual(Gallery.objects.all(), + ['']) + self.assertQuerysetEqual(Photo.objects.all(), + ['']) + + def test_ignored(self): + """Ignore anything that does not look like a image file. + E.g. hidden files, and folders. + We have two images: one in the top level of the zip, and one in a subfolder. + The second one gets ignored - we only process files at the zip root.""" + + with open(IGNORED_FILES_ZIP_PATH, mode='rb') as f: + test_file = File(f) + GalleryUpload.objects.create(title='Test', + zip_file=test_file) + + self.assertQuerysetEqual(Gallery.objects.all(), + ['']) + self.assertQuerysetEqual(Photo.objects.all(), + ['']) + + def test_existing(self): + """Add the photos in the zip to an existing gallery.""" + + existing = GalleryFactory(title='Existing') + + with open(SAMPLE_ZIP_PATH, mode='rb') as f: + test_file = File(f) + # Note how the title is not required. + GalleryUpload.objects.create(zip_file=test_file, + gallery=existing) + + self.assertQuerysetEqual(Gallery.objects.all(), + ['']) + self.assertQuerysetEqual(Photo.objects.all(), + ['']) + + # The photo is attached to the existing gallery. + self.assertQuerysetEqual(existing.photos.all(), + ['']) + + def test_duplicate_gallery(self): + """If we try to create Gallery with a title + that duplicates an existing title, refuse to load.""" + + GalleryFactory(title='Test') + + with open(SAMPLE_ZIP_PATH, mode='rb') as f: + test_file = File(f) + gallery = GalleryUpload(title='Test', + zip_file=test_file) + self.assertRaisesMessage(ValidationError, + 'A gallery with that title already exists.', + gallery.clean) + + def test_title_or_gallery(self): + """We should supply either a title field or a gallery.""" + + gallery = GalleryUpload() + self.assertRaisesMessage(ValidationError, + 'Select an existing gallery or enter a new gallery name.', + gallery.clean) + + def test_duplicate_title(self): + """If we try to create a Photo from the archive with a title + that duplicates an existing title, raise a warning.""" + + PhotoFactory(title='Test 1') + + with open(SAMPLE_ZIP_PATH, mode='rb') as f: + test_file = File(f) + GalleryUpload.objects.create(title='Test', + zip_file=test_file) + + self.assertQuerysetEqual(Gallery.objects.all(), + ['']) + self.assertQuerysetEqual(Photo.objects.all(), + ['']) + + # The (existing) photo is NOT attached to the gallery. + gallery = Gallery.objects.get(title='Test') + self.assertQuerysetEqual(gallery.photos.all(), + []) diff --git a/photologue/urls.py b/photologue/urls.py new file mode 100644 index 00000000..d960718a --- /dev/null +++ b/photologue/urls.py @@ -0,0 +1,82 @@ +from django.conf.urls import * +from django.views.generic import RedirectView +from django.core.urlresolvers import reverse_lazy + +from .views import PhotoListView, PhotoDetailView, GalleryListView, \ + GalleryDetailView, PhotoArchiveIndexView, PhotoDateDetailView, PhotoDayArchiveView, \ + PhotoYearArchiveView, PhotoMonthArchiveView, GalleryArchiveIndexView, GalleryYearArchiveView, \ + GalleryDateDetailView, GalleryDayArchiveView, GalleryMonthArchiveView + +"""NOTE: the url names are changing. In the long term, I want the prefix on all url names to be 'photologue-' +rather than 'pl-'. +This is simply to follow the Zen of Python - "Explicit is better than implicit". + +At the same time, I want to change some URL patterns, e.g. for pagination. + +So I've started changing the pagination to a new style prefix 'photologue-', and this will +coexist with the existing 'pl-' for some time. + +""" + + +urlpatterns = patterns('', + + url(r'^gallery/(?P\d{4})/(?P[a-z]{3})/(?P\w{1,2})/(?P[\-\d\w]+)/$', + GalleryDateDetailView.as_view(), + name='pl-gallery-detail'), + url(r'^gallery/(?P\d{4})/(?P[a-z]{3})/(?P\w{1,2})/$', + GalleryDayArchiveView.as_view(), + name='pl-gallery-archive-day'), + url(r'^gallery/(?P\d{4})/(?P[a-z]{3})/$', + GalleryMonthArchiveView.as_view(), + name='pl-gallery-archive-month'), + url(r'^gallery/(?P\d{4})/$', + GalleryYearArchiveView.as_view(), + name='pl-gallery-archive-year'), + url(r'^gallery/$', + GalleryArchiveIndexView.as_view(), + name='pl-gallery-archive'), + url(r'^$', + RedirectView.as_view(url=reverse_lazy('pl-gallery-archive')), + name='pl-photologue-root'), + url(r'^gallery/(?P[\-\d\w]+)/$', + GalleryDetailView.as_view(), name='pl-gallery'), + url(r'^gallerylist/$', + GalleryListView.as_view(), + name='photologue-gallery-list'), + + url(r'^photo/(?P\d{4})/(?P[a-z]{3})/(?P\w{1,2})/(?P[\-\d\w]+)/$', + PhotoDateDetailView.as_view(), + name='pl-photo-detail'), + url(r'^photo/(?P\d{4})/(?P[a-z]{3})/(?P\w{1,2})/$', + PhotoDayArchiveView.as_view(), + name='pl-photo-archive-day'), + url(r'^photo/(?P\d{4})/(?P[a-z]{3})/$', + PhotoMonthArchiveView.as_view(), + name='pl-photo-archive-month'), + url(r'^photo/(?P\d{4})/$', + PhotoYearArchiveView.as_view(), + name='pl-photo-archive-year'), + url(r'^photo/$', + PhotoArchiveIndexView.as_view(), + name='pl-photo-archive'), + + url(r'^photo/(?P[\-\d\w]+)/$', + PhotoDetailView.as_view(), + name='pl-photo'), + url(r'^photolist/$', + PhotoListView.as_view(), + name='photologue-photo-list'), + + # Deprecated URLs. + url(r'^gallery/page/(?P[0-9]+)/$', + GalleryListView.as_view(), + {'deprecated_pagination': True}, + name='pl-gallery-list'), + url(r'^photo/page/(?P[0-9]+)/$', + PhotoListView.as_view(), + {'deprecated_pagination': True}, + name='pl-photo-list'), + + + ) diff --git a/photologue/utils/EXIF.py b/photologue/utils/EXIF.py new file mode 100644 index 00000000..85a1c8c1 --- /dev/null +++ b/photologue/utils/EXIF.py @@ -0,0 +1,1768 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Library to extract EXIF information from digital camera image files +# http://sourceforge.net/projects/exif-py/ +# +# VERSION 1.1.0 +# +# To use this library call with: +# f = open(path_name, 'rb') +# tags = EXIF.process_file(f) +# +# To ignore MakerNote tags, pass the -q or --quick +# command line arguments, or as +# tags = EXIF.process_file(f, details=False) +# +# To stop processing after a certain tag is retrieved, +# pass the -t TAG or --stop-tag TAG argument, or as +# tags = EXIF.process_file(f, stop_tag='TAG') +# +# where TAG is a valid tag name, ex 'DateTimeOriginal' +# +# These 2 are useful when you are retrieving a large list of images +# +# +# To return an error on invalid tags, +# pass the -s or --strict argument, or as +# tags = EXIF.process_file(f, strict=True) +# +# Otherwise these tags will be ignored +# +# Returned tags will be a dictionary mapping names of EXIF tags to their +# values in the file named by path_name. You can process the tags +# as you wish. In particular, you can iterate through all the tags with: +# for tag in tags.keys(): +# if tag not in ('JPEGThumbnail', 'TIFFThumbnail', 'Filename', +# 'EXIF MakerNote'): +# print "Key: %s, value %s" % (tag, tags[tag]) +# (This code uses the if statement to avoid printing out a few of the +# tags that tend to be long or boring.) +# +# The tags dictionary will include keys for all of the usual EXIF +# tags, and will also include keys for Makernotes used by some +# cameras, for which we have a good specification. +# +# Note that the dictionary keys are the IFD name followed by the +# tag name. For example: +# 'EXIF DateTimeOriginal', 'Image Orientation', 'MakerNote FocusMode' +# +# Copyright (c) 2002-2007 Gene Cash All rights reserved +# Copyright (c) 2007-2008 Ianaré Sévi All rights reserved +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. 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. +# +# 3. Neither the name of the authors nor the names of its contributors +# 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. +# +# +# ----- See 'changes.txt' file for all contributors and changes ----- # +# +from __future__ import print_function + + +# Don't throw an exception when given an out of range character. +def make_string(seq): + str = '' + for c in seq: + # Screen out non-printing characters + if 32 <= c and c < 256: + str += chr(c) + # If no printing chars + if not str: + return seq + return str + +# Special version to deal with the code in the first 8 bytes of a user comment. +# First 8 bytes gives coding system e.g. ASCII vs. JIS vs Unicode +def make_string_uc(seq): + code = seq[0:8] + seq = seq[8:] + # Of course, this is only correct if ASCII, and the standard explicitly + # allows JIS and Unicode. + return make_string(seq) + +# field type descriptions as (length, abbreviation, full name) tuples +FIELD_TYPES = ( + (0, 'X', 'Proprietary'), # no such type + (1, 'B', 'Byte'), + (1, 'A', 'ASCII'), + (2, 'S', 'Short'), + (4, 'L', 'Long'), + (8, 'R', 'Ratio'), + (1, 'SB', 'Signed Byte'), + (1, 'U', 'Undefined'), + (2, 'SS', 'Signed Short'), + (4, 'SL', 'Signed Long'), + (8, 'SR', 'Signed Ratio'), + ) + +# dictionary of main EXIF tag names +# first element of tuple is tag name, optional second element is +# another dictionary giving names to values +EXIF_TAGS = { + 0x0100: ('ImageWidth',), + 0x0101: ('ImageLength',), + 0x0102: ('BitsPerSample',), + 0x0103: ('Compression', + {1: 'Uncompressed', + 2: 'CCITT 1D', + 3: 'T4/Group 3 Fax', + 4: 'T6/Group 4 Fax', + 5: 'LZW', + 6: 'JPEG (old-style)', + 7: 'JPEG', + 8: 'Adobe Deflate', + 9: 'JBIG B&W', + 10: 'JBIG Color', + 32766: 'Next', + 32769: 'Epson ERF Compressed', + 32771: 'CCIRLEW', + 32773: 'PackBits', + 32809: 'Thunderscan', + 32895: 'IT8CTPAD', + 32896: 'IT8LW', + 32897: 'IT8MP', + 32898: 'IT8BL', + 32908: 'PixarFilm', + 32909: 'PixarLog', + 32946: 'Deflate', + 32947: 'DCS', + 34661: 'JBIG', + 34676: 'SGILog', + 34677: 'SGILog24', + 34712: 'JPEG 2000', + 34713: 'Nikon NEF Compressed', + 65000: 'Kodak DCR Compressed', + 65535: 'Pentax PEF Compressed'}), + 0x0106: ('PhotometricInterpretation',), + 0x0107: ('Thresholding',), + 0x010A: ('FillOrder',), + 0x010D: ('DocumentName',), + 0x010E: ('ImageDescription',), + 0x010F: ('Make',), + 0x0110: ('Model',), + 0x0111: ('StripOffsets',), + 0x0112: ('Orientation', + {1: 'Horizontal (normal)', + 2: 'Mirrored horizontal', + 3: 'Rotated 180', + 4: 'Mirrored vertical', + 5: 'Mirrored horizontal then rotated 90 CCW', + 6: 'Rotated 90 CW', + 7: 'Mirrored horizontal then rotated 90 CW', + 8: 'Rotated 90 CCW'}), + 0x0115: ('SamplesPerPixel',), + 0x0116: ('RowsPerStrip',), + 0x0117: ('StripByteCounts',), + 0x011A: ('XResolution',), + 0x011B: ('YResolution',), + 0x011C: ('PlanarConfiguration',), + 0x011D: ('PageName', make_string), + 0x0128: ('ResolutionUnit', + {1: 'Not Absolute', + 2: 'Pixels/Inch', + 3: 'Pixels/Centimeter'}), + 0x012D: ('TransferFunction',), + 0x0131: ('Software',), + 0x0132: ('DateTime',), + 0x013B: ('Artist',), + 0x013E: ('WhitePoint',), + 0x013F: ('PrimaryChromaticities',), + 0x0156: ('TransferRange',), + 0x0200: ('JPEGProc',), + 0x0201: ('JPEGInterchangeFormat',), + 0x0202: ('JPEGInterchangeFormatLength',), + 0x0211: ('YCbCrCoefficients',), + 0x0212: ('YCbCrSubSampling',), + 0x0213: ('YCbCrPositioning', + {1: 'Centered', + 2: 'Co-sited'}), + 0x0214: ('ReferenceBlackWhite',), + + 0x4746: ('Rating',), + + 0x828D: ('CFARepeatPatternDim',), + 0x828E: ('CFAPattern',), + 0x828F: ('BatteryLevel',), + 0x8298: ('Copyright',), + 0x829A: ('ExposureTime',), + 0x829D: ('FNumber',), + 0x83BB: ('IPTC/NAA',), + 0x8769: ('ExifOffset',), + 0x8773: ('InterColorProfile',), + 0x8822: ('ExposureProgram', + {0: 'Unidentified', + 1: 'Manual', + 2: 'Program Normal', + 3: 'Aperture Priority', + 4: 'Shutter Priority', + 5: 'Program Creative', + 6: 'Program Action', + 7: 'Portrait Mode', + 8: 'Landscape Mode'}), + 0x8824: ('SpectralSensitivity',), + 0x8825: ('GPSInfo',), + 0x8827: ('ISOSpeedRatings',), + 0x8828: ('OECF',), + 0x9000: ('ExifVersion', make_string), + 0x9003: ('DateTimeOriginal',), + 0x9004: ('DateTimeDigitized',), + 0x9101: ('ComponentsConfiguration', + {0: '', + 1: 'Y', + 2: 'Cb', + 3: 'Cr', + 4: 'Red', + 5: 'Green', + 6: 'Blue'}), + 0x9102: ('CompressedBitsPerPixel',), + 0x9201: ('ShutterSpeedValue',), + 0x9202: ('ApertureValue',), + 0x9203: ('BrightnessValue',), + 0x9204: ('ExposureBiasValue',), + 0x9205: ('MaxApertureValue',), + 0x9206: ('SubjectDistance',), + 0x9207: ('MeteringMode', + {0: 'Unidentified', + 1: 'Average', + 2: 'CenterWeightedAverage', + 3: 'Spot', + 4: 'MultiSpot', + 5: 'Pattern'}), + 0x9208: ('LightSource', + {0: 'Unknown', + 1: 'Daylight', + 2: 'Fluorescent', + 3: 'Tungsten', + 9: 'Fine Weather', + 10: 'Flash', + 11: 'Shade', + 12: 'Daylight Fluorescent', + 13: 'Day White Fluorescent', + 14: 'Cool White Fluorescent', + 15: 'White Fluorescent', + 17: 'Standard Light A', + 18: 'Standard Light B', + 19: 'Standard Light C', + 20: 'D55', + 21: 'D65', + 22: 'D75', + 255: 'Other'}), + 0x9209: ('Flash', + {0: 'No', + 1: 'Fired', + 5: 'Fired (?)', # no return sensed + 7: 'Fired (!)', # return sensed + 9: 'Fill Fired', + 13: 'Fill Fired (?)', + 15: 'Fill Fired (!)', + 16: 'Off', + 24: 'Auto Off', + 25: 'Auto Fired', + 29: 'Auto Fired (?)', + 31: 'Auto Fired (!)', + 32: 'Not Available'}), + 0x920A: ('FocalLength',), + 0x9214: ('SubjectArea',), + 0x927C: ('MakerNote',), + 0x9286: ('UserComment', make_string_uc), + 0x9290: ('SubSecTime',), + 0x9291: ('SubSecTimeOriginal',), + 0x9292: ('SubSecTimeDigitized',), + + # used by Windows Explorer + 0x9C9B: ('XPTitle',), + 0x9C9C: ('XPComment',), + 0x9C9D: ('XPAuthor',), #(ignored by Windows Explorer if Artist exists) + 0x9C9E: ('XPKeywords',), + 0x9C9F: ('XPSubject',), + + 0xA000: ('FlashPixVersion', make_string), + 0xA001: ('ColorSpace', + {1: 'sRGB', + 2: 'Adobe RGB', + 65535: 'Uncalibrated'}), + 0xA002: ('ExifImageWidth',), + 0xA003: ('ExifImageLength',), + 0xA005: ('InteroperabilityOffset',), + 0xA20B: ('FlashEnergy',), # 0x920B in TIFF/EP + 0xA20C: ('SpatialFrequencyResponse',), # 0x920C + 0xA20E: ('FocalPlaneXResolution',), # 0x920E + 0xA20F: ('FocalPlaneYResolution',), # 0x920F + 0xA210: ('FocalPlaneResolutionUnit',), # 0x9210 + 0xA214: ('SubjectLocation',), # 0x9214 + 0xA215: ('ExposureIndex',), # 0x9215 + 0xA217: ('SensingMethod', # 0x9217 + {1: 'Not defined', + 2: 'One-chip color area', + 3: 'Two-chip color area', + 4: 'Three-chip color area', + 5: 'Color sequential area', + 7: 'Trilinear', + 8: 'Color sequential linear'}), + 0xA300: ('FileSource', + {1: 'Film Scanner', + 2: 'Reflection Print Scanner', + 3: 'Digital Camera'}), + 0xA301: ('SceneType', + {1: 'Directly Photographed'}), + 0xA302: ('CVAPattern',), + 0xA401: ('CustomRendered', + {0: 'Normal', + 1: 'Custom'}), + 0xA402: ('ExposureMode', + {0: 'Auto Exposure', + 1: 'Manual Exposure', + 2: 'Auto Bracket'}), + 0xA403: ('WhiteBalance', + {0: 'Auto', + 1: 'Manual'}), + 0xA404: ('DigitalZoomRatio',), + 0xA405: ('FocalLengthIn35mmFilm',), + 0xA406: ('SceneCaptureType', + {0: 'Standard', + 1: 'Landscape', + 2: 'Portrait', + 3: 'Night)'}), + 0xA407: ('GainControl', + {0: 'None', + 1: 'Low gain up', + 2: 'High gain up', + 3: 'Low gain down', + 4: 'High gain down'}), + 0xA408: ('Contrast', + {0: 'Normal', + 1: 'Soft', + 2: 'Hard'}), + 0xA409: ('Saturation', + {0: 'Normal', + 1: 'Soft', + 2: 'Hard'}), + 0xA40A: ('Sharpness', + {0: 'Normal', + 1: 'Soft', + 2: 'Hard'}), + 0xA40B: ('DeviceSettingDescription',), + 0xA40C: ('SubjectDistanceRange',), + 0xA500: ('Gamma',), + 0xC4A5: ('PrintIM',), + 0xEA1C: ('Padding',), + } + +# interoperability tags +INTR_TAGS = { + 0x0001: ('InteroperabilityIndex',), + 0x0002: ('InteroperabilityVersion',), + 0x1000: ('RelatedImageFileFormat',), + 0x1001: ('RelatedImageWidth',), + 0x1002: ('RelatedImageLength',), + } + +# GPS tags (not used yet, haven't seen camera with GPS) +GPS_TAGS = { + 0x0000: ('GPSVersionID',), + 0x0001: ('GPSLatitudeRef',), + 0x0002: ('GPSLatitude',), + 0x0003: ('GPSLongitudeRef',), + 0x0004: ('GPSLongitude',), + 0x0005: ('GPSAltitudeRef',), + 0x0006: ('GPSAltitude',), + 0x0007: ('GPSTimeStamp',), + 0x0008: ('GPSSatellites',), + 0x0009: ('GPSStatus',), + 0x000A: ('GPSMeasureMode',), + 0x000B: ('GPSDOP',), + 0x000C: ('GPSSpeedRef',), + 0x000D: ('GPSSpeed',), + 0x000E: ('GPSTrackRef',), + 0x000F: ('GPSTrack',), + 0x0010: ('GPSImgDirectionRef',), + 0x0011: ('GPSImgDirection',), + 0x0012: ('GPSMapDatum',), + 0x0013: ('GPSDestLatitudeRef',), + 0x0014: ('GPSDestLatitude',), + 0x0015: ('GPSDestLongitudeRef',), + 0x0016: ('GPSDestLongitude',), + 0x0017: ('GPSDestBearingRef',), + 0x0018: ('GPSDestBearing',), + 0x0019: ('GPSDestDistanceRef',), + 0x001A: ('GPSDestDistance',), + 0x001D: ('GPSDate',), + } + +# Ignore these tags when quick processing +# 0x927C is MakerNote Tags +# 0x9286 is user comment +IGNORE_TAGS = (0x9286, 0x927C) + +# http://tomtia.plala.jp/DigitalCamera/MakerNote/index.asp +def nikon_ev_bias(seq): + # First digit seems to be in steps of 1/6 EV. + # Does the third value mean the step size? It is usually 6, + # but it is 12 for the ExposureDifference. + # + # Check for an error condition that could cause a crash. + # This only happens if something has gone really wrong in + # reading the Nikon MakerNote. + if len(seq) < 4 : return "" + # + if seq == [252, 1, 6, 0]: + return "-2/3 EV" + if seq == [253, 1, 6, 0]: + return "-1/2 EV" + if seq == [254, 1, 6, 0]: + return "-1/3 EV" + if seq == [0, 1, 6, 0]: + return "0 EV" + if seq == [2, 1, 6, 0]: + return "+1/3 EV" + if seq == [3, 1, 6, 0]: + return "+1/2 EV" + if seq == [4, 1, 6, 0]: + return "+2/3 EV" + # Handle combinations not in the table. + a = seq[0] + # Causes headaches for the +/- logic, so special case it. + if a == 0: + return "0 EV" + if a > 127: + a = 256 - a + ret_str = "-" + else: + ret_str = "+" + b = seq[2] # Assume third value means the step size + whole = a / b + a = a % b + if whole != 0: + ret_str = ret_str + str(whole) + " " + if a == 0: + ret_str = ret_str + "EV" + else: + r = Ratio(a, b) + ret_str = ret_str + r.__repr__() + " EV" + return ret_str + +# Nikon E99x MakerNote Tags +MAKERNOTE_NIKON_NEWER_TAGS = { + 0x0001: ('MakernoteVersion', make_string), # Sometimes binary + 0x0002: ('ISOSetting', make_string), + 0x0003: ('ColorMode',), + 0x0004: ('Quality',), + 0x0005: ('Whitebalance',), + 0x0006: ('ImageSharpening',), + 0x0007: ('FocusMode',), + 0x0008: ('FlashSetting',), + 0x0009: ('AutoFlashMode',), + 0x000B: ('WhiteBalanceBias',), + 0x000C: ('WhiteBalanceRBCoeff',), + 0x000D: ('ProgramShift', nikon_ev_bias), + # Nearly the same as the other EV vals, but step size is 1/12 EV (?) + 0x000E: ('ExposureDifference', nikon_ev_bias), + 0x000F: ('ISOSelection',), + 0x0011: ('NikonPreview',), + 0x0012: ('FlashCompensation', nikon_ev_bias), + 0x0013: ('ISOSpeedRequested',), + 0x0016: ('PhotoCornerCoordinates',), + # 0x0017: Unknown, but most likely an EV value + 0x0018: ('FlashBracketCompensationApplied', nikon_ev_bias), + 0x0019: ('AEBracketCompensationApplied',), + 0x001A: ('ImageProcessing',), + 0x001B: ('CropHiSpeed',), + 0x001D: ('SerialNumber',), # Conflict with 0x00A0 ? + 0x001E: ('ColorSpace',), + 0x001F: ('VRInfo',), + 0x0020: ('ImageAuthentication',), + 0x0022: ('ActiveDLighting',), + 0x0023: ('PictureControl',), + 0x0024: ('WorldTime',), + 0x0025: ('ISOInfo',), + 0x0080: ('ImageAdjustment',), + 0x0081: ('ToneCompensation',), + 0x0082: ('AuxiliaryLens',), + 0x0083: ('LensType',), + 0x0084: ('LensMinMaxFocalMaxAperture',), + 0x0085: ('ManualFocusDistance',), + 0x0086: ('DigitalZoomFactor',), + 0x0087: ('FlashMode', + {0x00: 'Did Not Fire', + 0x01: 'Fired, Manual', + 0x07: 'Fired, External', + 0x08: 'Fired, Commander Mode ', + 0x09: 'Fired, TTL Mode'}), + 0x0088: ('AFFocusPosition', + {0x0000: 'Center', + 0x0100: 'Top', + 0x0200: 'Bottom', + 0x0300: 'Left', + 0x0400: 'Right'}), + 0x0089: ('BracketingMode', + {0x00: 'Single frame, no bracketing', + 0x01: 'Continuous, no bracketing', + 0x02: 'Timer, no bracketing', + 0x10: 'Single frame, exposure bracketing', + 0x11: 'Continuous, exposure bracketing', + 0x12: 'Timer, exposure bracketing', + 0x40: 'Single frame, white balance bracketing', + 0x41: 'Continuous, white balance bracketing', + 0x42: 'Timer, white balance bracketing'}), + 0x008A: ('AutoBracketRelease',), + 0x008B: ('LensFStops',), + 0x008C: ('NEFCurve1',), # ExifTool calls this 'ContrastCurve' + 0x008D: ('ColorMode',), + 0x008F: ('SceneMode',), + 0x0090: ('LightingType',), + 0x0091: ('ShotInfo',), # First 4 bytes are a version number in ASCII + 0x0092: ('HueAdjustment',), + # ExifTool calls this 'NEFCompression', should be 1-4 + 0x0093: ('Compression',), + 0x0094: ('Saturation', + {-3: 'B&W', + - 2: '-2', + - 1: '-1', + 0: '0', + 1: '1', + 2: '2'}), + 0x0095: ('NoiseReduction',), + 0x0096: ('NEFCurve2',), # ExifTool calls this 'LinearizationTable' + 0x0097: ('ColorBalance',), # First 4 bytes are a version number in ASCII + 0x0098: ('LensData',), # First 4 bytes are a version number in ASCII + 0x0099: ('RawImageCenter',), + 0x009A: ('SensorPixelSize',), + 0x009C: ('Scene Assist',), + 0x009E: ('RetouchHistory',), + 0x00A0: ('SerialNumber',), + 0x00A2: ('ImageDataSize',), + # 00A3: unknown - a single byte 0 + # 00A4: In NEF, looks like a 4 byte ASCII version number ('0200') + 0x00A5: ('ImageCount',), + 0x00A6: ('DeletedImageCount',), + 0x00A7: ('TotalShutterReleases',), + # First 4 bytes are a version number in ASCII, with version specific + # info to follow. Its hard to treat it as a string due to embedded nulls. + 0x00A8: ('FlashInfo',), + 0x00A9: ('ImageOptimization',), + 0x00AA: ('Saturation',), + 0x00AB: ('DigitalVariProgram',), + 0x00AC: ('ImageStabilization',), + 0x00AD: ('Responsive AF',), # 'AFResponse' + 0x00B0: ('MultiExposure',), + 0x00B1: ('HighISONoiseReduction',), + 0x00B7: ('AFInfo',), + 0x00B8: ('FileInfo',), + # 00B9: unknown + 0x0100: ('DigitalICE',), + 0x0103: ('PreviewCompression', + {1: 'Uncompressed', + 2: 'CCITT 1D', + 3: 'T4/Group 3 Fax', + 4: 'T6/Group 4 Fax', + 5: 'LZW', + 6: 'JPEG (old-style)', + 7: 'JPEG', + 8: 'Adobe Deflate', + 9: 'JBIG B&W', + 10: 'JBIG Color', + 32766: 'Next', + 32769: 'Epson ERF Compressed', + 32771: 'CCIRLEW', + 32773: 'PackBits', + 32809: 'Thunderscan', + 32895: 'IT8CTPAD', + 32896: 'IT8LW', + 32897: 'IT8MP', + 32898: 'IT8BL', + 32908: 'PixarFilm', + 32909: 'PixarLog', + 32946: 'Deflate', + 32947: 'DCS', + 34661: 'JBIG', + 34676: 'SGILog', + 34677: 'SGILog24', + 34712: 'JPEG 2000', + 34713: 'Nikon NEF Compressed', + 65000: 'Kodak DCR Compressed', + 65535: 'Pentax PEF Compressed', }), + 0x0201: ('PreviewImageStart',), + 0x0202: ('PreviewImageLength',), + 0x0213: ('PreviewYCbCrPositioning', + {1: 'Centered', + 2: 'Co-sited'}), + 0x0010: ('DataDump',), + } + +MAKERNOTE_NIKON_OLDER_TAGS = { + 0x0003: ('Quality', + {1: 'VGA Basic', + 2: 'VGA Normal', + 3: 'VGA Fine', + 4: 'SXGA Basic', + 5: 'SXGA Normal', + 6: 'SXGA Fine'}), + 0x0004: ('ColorMode', + {1: 'Color', + 2: 'Monochrome'}), + 0x0005: ('ImageAdjustment', + {0: 'Normal', + 1: 'Bright+', + 2: 'Bright-', + 3: 'Contrast+', + 4: 'Contrast-'}), + 0x0006: ('CCDSpeed', + {0: 'ISO 80', + 2: 'ISO 160', + 4: 'ISO 320', + 5: 'ISO 100'}), + 0x0007: ('WhiteBalance', + {0: 'Auto', + 1: 'Preset', + 2: 'Daylight', + 3: 'Incandescent', + 4: 'Fluorescent', + 5: 'Cloudy', + 6: 'Speed Light'}), + } + +# decode Olympus SpecialMode tag in MakerNote +def olympus_special_mode(v): + a = { + 0: 'Normal', + 1: 'Unknown', + 2: 'Fast', + 3: 'Panorama'} + b = { + 0: 'Non-panoramic', + 1: 'Left to right', + 2: 'Right to left', + 3: 'Bottom to top', + 4: 'Top to bottom'} + if v[0] not in a or v[2] not in b: + return v + return '%s - sequence %d - %s' % (a[v[0]], v[1], b[v[2]]) + +MAKERNOTE_OLYMPUS_TAGS = { + # ah HAH! those sneeeeeaky bastids! this is how they get past the fact + # that a JPEG thumbnail is not allowed in an uncompressed TIFF file + 0x0100: ('JPEGThumbnail',), + 0x0200: ('SpecialMode', olympus_special_mode), + 0x0201: ('JPEGQual', + {1: 'SQ', + 2: 'HQ', + 3: 'SHQ'}), + 0x0202: ('Macro', + {0: 'Normal', + 1: 'Macro', + 2: 'SuperMacro'}), + 0x0203: ('BWMode', + {0: 'Off', + 1: 'On'}), + 0x0204: ('DigitalZoom',), + 0x0205: ('FocalPlaneDiagonal',), + 0x0206: ('LensDistortionParams',), + 0x0207: ('SoftwareRelease',), + 0x0208: ('PictureInfo',), + 0x0209: ('CameraID', make_string), # print as string + 0x0F00: ('DataDump',), + 0x0300: ('PreCaptureFrames',), + 0x0404: ('SerialNumber',), + 0x1000: ('ShutterSpeedValue',), + 0x1001: ('ISOValue',), + 0x1002: ('ApertureValue',), + 0x1003: ('BrightnessValue',), + 0x1004: ('FlashMode',), + 0x1004: ('FlashMode', + {2: 'On', + 3: 'Off'}), + 0x1005: ('FlashDevice', + {0: 'None', + 1: 'Internal', + 4: 'External', + 5: 'Internal + External'}), + 0x1006: ('ExposureCompensation',), + 0x1007: ('SensorTemperature',), + 0x1008: ('LensTemperature',), + 0x100b: ('FocusMode', + {0: 'Auto', + 1: 'Manual'}), + 0x1017: ('RedBalance',), + 0x1018: ('BlueBalance',), + 0x101a: ('SerialNumber',), + 0x1023: ('FlashExposureComp',), + 0x1026: ('ExternalFlashBounce', + {0: 'No', + 1: 'Yes'}), + 0x1027: ('ExternalFlashZoom',), + 0x1028: ('ExternalFlashMode',), + 0x1029: ('Contrast int16u', + {0: 'High', + 1: 'Normal', + 2: 'Low'}), + 0x102a: ('SharpnessFactor',), + 0x102b: ('ColorControl',), + 0x102c: ('ValidBits',), + 0x102d: ('CoringFilter',), + 0x102e: ('OlympusImageWidth',), + 0x102f: ('OlympusImageHeight',), + 0x1034: ('CompressionRatio',), + 0x1035: ('PreviewImageValid', + {0: 'No', + 1: 'Yes'}), + 0x1036: ('PreviewImageStart',), + 0x1037: ('PreviewImageLength',), + 0x1039: ('CCDScanMode', + {0: 'Interlaced', + 1: 'Progressive'}), + 0x103a: ('NoiseReduction', + {0: 'Off', + 1: 'On'}), + 0x103b: ('InfinityLensStep',), + 0x103c: ('NearLensStep',), + + # TODO - these need extra definitions + # http://search.cpan.org/src/EXIFTOOL/Image-ExifTool-6.90/html/TagNames/Olympus.html + 0x2010: ('Equipment',), + 0x2020: ('CameraSettings',), + 0x2030: ('RawDevelopment',), + 0x2040: ('ImageProcessing',), + 0x2050: ('FocusInfo',), + 0x3000: ('RawInfo ',), + } + +# 0x2020 CameraSettings +MAKERNOTE_OLYMPUS_TAG_0x2020 = { + 0x0100: ('PreviewImageValid', + {0: 'No', + 1: 'Yes'}), + 0x0101: ('PreviewImageStart',), + 0x0102: ('PreviewImageLength',), + 0x0200: ('ExposureMode', + {1: 'Manual', + 2: 'Program', + 3: 'Aperture-priority AE', + 4: 'Shutter speed priority AE', + 5: 'Program-shift'}), + 0x0201: ('AELock', + {0: 'Off', + 1: 'On'}), + 0x0202: ('MeteringMode', + {2: 'Center Weighted', + 3: 'Spot', + 5: 'ESP', + 261: 'Pattern+AF', + 515: 'Spot+Highlight control', + 1027: 'Spot+Shadow control'}), + 0x0300: ('MacroMode', + {0: 'Off', + 1: 'On'}), + 0x0301: ('FocusMode', + {0: 'Single AF', + 1: 'Sequential shooting AF', + 2: 'Continuous AF', + 3: 'Multi AF', + 10: 'MF'}), + 0x0302: ('FocusProcess', + {0: 'AF Not Used', + 1: 'AF Used'}), + 0x0303: ('AFSearch', + {0: 'Not Ready', + 1: 'Ready'}), + 0x0304: ('AFAreas',), + 0x0401: ('FlashExposureCompensation',), + 0x0500: ('WhiteBalance2', + {0: 'Auto', + 16: '7500K (Fine Weather with Shade)', + 17: '6000K (Cloudy)', + 18: '5300K (Fine Weather)', + 20: '3000K (Tungsten light)', + 21: '3600K (Tungsten light-like)', + 33: '6600K (Daylight fluorescent)', + 34: '4500K (Neutral white fluorescent)', + 35: '4000K (Cool white fluorescent)', + 48: '3600K (Tungsten light-like)', + 256: 'Custom WB 1', + 257: 'Custom WB 2', + 258: 'Custom WB 3', + 259: 'Custom WB 4', + 512: 'Custom WB 5400K', + 513: 'Custom WB 2900K', + 514: 'Custom WB 8000K', }), + 0x0501: ('WhiteBalanceTemperature',), + 0x0502: ('WhiteBalanceBracket',), + 0x0503: ('CustomSaturation',), # (3 numbers: 1. CS Value, 2. Min, 3. Max) + 0x0504: ('ModifiedSaturation', + {0: 'Off', + 1: 'CM1 (Red Enhance)', + 2: 'CM2 (Green Enhance)', + 3: 'CM3 (Blue Enhance)', + 4: 'CM4 (Skin Tones)'}), + 0x0505: ('ContrastSetting',), # (3 numbers: 1. Contrast, 2. Min, 3. Max) + 0x0506: ('SharpnessSetting',), # (3 numbers: 1. Sharpness, 2. Min, 3. Max) + 0x0507: ('ColorSpace', + {0: 'sRGB', + 1: 'Adobe RGB', + 2: 'Pro Photo RGB'}), + 0x0509: ('SceneMode', + {0: 'Standard', + 6: 'Auto', + 7: 'Sport', + 8: 'Portrait', + 9: 'Landscape+Portrait', + 10: 'Landscape', + 11: 'Night scene', + 13: 'Panorama', + 16: 'Landscape+Portrait', + 17: 'Night+Portrait', + 19: 'Fireworks', + 20: 'Sunset', + 22: 'Macro', + 25: 'Documents', + 26: 'Museum', + 28: 'Beach&Snow', + 30: 'Candle', + 35: 'Underwater Wide1', + 36: 'Underwater Macro', + 39: 'High Key', + 40: 'Digital Image Stabilization', + 44: 'Underwater Wide2', + 45: 'Low Key', + 46: 'Children', + 48: 'Nature Macro'}), + 0x050a: ('NoiseReduction', + {0: 'Off', + 1: 'Noise Reduction', + 2: 'Noise Filter', + 3: 'Noise Reduction + Noise Filter', + 4: 'Noise Filter (ISO Boost)', + 5: 'Noise Reduction + Noise Filter (ISO Boost)'}), + 0x050b: ('DistortionCorrection', + {0: 'Off', + 1: 'On'}), + 0x050c: ('ShadingCompensation', + {0: 'Off', + 1: 'On'}), + 0x050d: ('CompressionFactor',), + 0x050f: ('Gradation', + {'-1 -1 1': 'Low Key', + '0 -1 1': 'Normal', + '1 -1 1': 'High Key'}), + 0x0520: ('PictureMode', + {1: 'Vivid', + 2: 'Natural', + 3: 'Muted', + 256: 'Monotone', + 512: 'Sepia'}), + 0x0521: ('PictureModeSaturation',), + 0x0522: ('PictureModeHue?',), + 0x0523: ('PictureModeContrast',), + 0x0524: ('PictureModeSharpness',), + 0x0525: ('PictureModeBWFilter', + {0: 'n/a', + 1: 'Neutral', + 2: 'Yellow', + 3: 'Orange', + 4: 'Red', + 5: 'Green'}), + 0x0526: ('PictureModeTone', + {0: 'n/a', + 1: 'Neutral', + 2: 'Sepia', + 3: 'Blue', + 4: 'Purple', + 5: 'Green'}), + 0x0600: ('Sequence',), # 2 or 3 numbers: 1. Mode, 2. Shot number, 3. Mode bits + 0x0601: ('PanoramaMode',), # (2 numbers: 1. Mode, 2. Shot number) + 0x0603: ('ImageQuality2', + {1: 'SQ', + 2: 'HQ', + 3: 'SHQ', + 4: 'RAW'}), + 0x0901: ('ManometerReading',), + } + + +MAKERNOTE_CASIO_TAGS = { + 0x0001: ('RecordingMode', + {1: 'Single Shutter', + 2: 'Panorama', + 3: 'Night Scene', + 4: 'Portrait', + 5: 'Landscape'}), + 0x0002: ('Quality', + {1: 'Economy', + 2: 'Normal', + 3: 'Fine'}), + 0x0003: ('FocusingMode', + {2: 'Macro', + 3: 'Auto Focus', + 4: 'Manual Focus', + 5: 'Infinity'}), + 0x0004: ('FlashMode', + {1: 'Auto', + 2: 'On', + 3: 'Off', + 4: 'Red Eye Reduction'}), + 0x0005: ('FlashIntensity', + {11: 'Weak', + 13: 'Normal', + 15: 'Strong'}), + 0x0006: ('Object Distance',), + 0x0007: ('WhiteBalance', + {1: 'Auto', + 2: 'Tungsten', + 3: 'Daylight', + 4: 'Fluorescent', + 5: 'Shade', + 129: 'Manual'}), + 0x000B: ('Sharpness', + {0: 'Normal', + 1: 'Soft', + 2: 'Hard'}), + 0x000C: ('Contrast', + {0: 'Normal', + 1: 'Low', + 2: 'High'}), + 0x000D: ('Saturation', + {0: 'Normal', + 1: 'Low', + 2: 'High'}), + 0x0014: ('CCDSpeed', + {64: 'Normal', + 80: 'Normal', + 100: 'High', + 125: '+1.0', + 244: '+3.0', + 250: '+2.0'}), + } + +MAKERNOTE_FUJIFILM_TAGS = { + 0x0000: ('NoteVersion', make_string), + 0x1000: ('Quality',), + 0x1001: ('Sharpness', + {1: 'Soft', + 2: 'Soft', + 3: 'Normal', + 4: 'Hard', + 5: 'Hard'}), + 0x1002: ('WhiteBalance', + {0: 'Auto', + 256: 'Daylight', + 512: 'Cloudy', + 768: 'DaylightColor-Fluorescent', + 769: 'DaywhiteColor-Fluorescent', + 770: 'White-Fluorescent', + 1024: 'Incandescent', + 3840: 'Custom'}), + 0x1003: ('Color', + {0: 'Normal', + 256: 'High', + 512: 'Low'}), + 0x1004: ('Tone', + {0: 'Normal', + 256: 'High', + 512: 'Low'}), + 0x1010: ('FlashMode', + {0: 'Auto', + 1: 'On', + 2: 'Off', + 3: 'Red Eye Reduction'}), + 0x1011: ('FlashStrength',), + 0x1020: ('Macro', + {0: 'Off', + 1: 'On'}), + 0x1021: ('FocusMode', + {0: 'Auto', + 1: 'Manual'}), + 0x1030: ('SlowSync', + {0: 'Off', + 1: 'On'}), + 0x1031: ('PictureMode', + {0: 'Auto', + 1: 'Portrait', + 2: 'Landscape', + 4: 'Sports', + 5: 'Night', + 6: 'Program AE', + 256: 'Aperture Priority AE', + 512: 'Shutter Priority AE', + 768: 'Manual Exposure'}), + 0x1100: ('MotorOrBracket', + {0: 'Off', + 1: 'On'}), + 0x1300: ('BlurWarning', + {0: 'Off', + 1: 'On'}), + 0x1301: ('FocusWarning', + {0: 'Off', + 1: 'On'}), + 0x1302: ('AEWarning', + {0: 'Off', + 1: 'On'}), + } + +MAKERNOTE_CANON_TAGS = { + 0x0006: ('ImageType',), + 0x0007: ('FirmwareVersion',), + 0x0008: ('ImageNumber',), + 0x0009: ('OwnerName',), + } + +# this is in element offset, name, optional value dictionary format +MAKERNOTE_CANON_TAG_0x001 = { + 1: ('Macromode', + {1: 'Macro', + 2: 'Normal'}), + 2: ('SelfTimer',), + 3: ('Quality', + {2: 'Normal', + 3: 'Fine', + 5: 'Superfine'}), + 4: ('FlashMode', + {0: 'Flash Not Fired', + 1: 'Auto', + 2: 'On', + 3: 'Red-Eye Reduction', + 4: 'Slow Synchro', + 5: 'Auto + Red-Eye Reduction', + 6: 'On + Red-Eye Reduction', + 16: 'external flash'}), + 5: ('ContinuousDriveMode', + {0: 'Single Or Timer', + 1: 'Continuous'}), + 7: ('FocusMode', + {0: 'One-Shot', + 1: 'AI Servo', + 2: 'AI Focus', + 3: 'MF', + 4: 'Single', + 5: 'Continuous', + 6: 'MF'}), + 10: ('ImageSize', + {0: 'Large', + 1: 'Medium', + 2: 'Small'}), + 11: ('EasyShootingMode', + {0: 'Full Auto', + 1: 'Manual', + 2: 'Landscape', + 3: 'Fast Shutter', + 4: 'Slow Shutter', + 5: 'Night', + 6: 'B&W', + 7: 'Sepia', + 8: 'Portrait', + 9: 'Sports', + 10: 'Macro/Close-Up', + 11: 'Pan Focus'}), + 12: ('DigitalZoom', + {0: 'None', + 1: '2x', + 2: '4x'}), + 13: ('Contrast', + {0xFFFF: 'Low', + 0: 'Normal', + 1: 'High'}), + 14: ('Saturation', + {0xFFFF: 'Low', + 0: 'Normal', + 1: 'High'}), + 15: ('Sharpness', + {0xFFFF: 'Low', + 0: 'Normal', + 1: 'High'}), + 16: ('ISO', + {0: 'See ISOSpeedRatings Tag', + 15: 'Auto', + 16: '50', + 17: '100', + 18: '200', + 19: '400'}), + 17: ('MeteringMode', + {3: 'Evaluative', + 4: 'Partial', + 5: 'Center-weighted'}), + 18: ('FocusType', + {0: 'Manual', + 1: 'Auto', + 3: 'Close-Up (Macro)', + 8: 'Locked (Pan Mode)'}), + 19: ('AFPointSelected', + {0x3000: 'None (MF)', + 0x3001: 'Auto-Selected', + 0x3002: 'Right', + 0x3003: 'Center', + 0x3004: 'Left'}), + 20: ('ExposureMode', + {0: 'Easy Shooting', + 1: 'Program', + 2: 'Tv-priority', + 3: 'Av-priority', + 4: 'Manual', + 5: 'A-DEP'}), + 23: ('LongFocalLengthOfLensInFocalUnits',), + 24: ('ShortFocalLengthOfLensInFocalUnits',), + 25: ('FocalUnitsPerMM',), + 28: ('FlashActivity', + {0: 'Did Not Fire', + 1: 'Fired'}), + 29: ('FlashDetails', + {14: 'External E-TTL', + 13: 'Internal Flash', + 11: 'FP Sync Used', + 7: '2nd("Rear")-Curtain Sync Used', + 4: 'FP Sync Enabled'}), + 32: ('FocusMode', + {0: 'Single', + 1: 'Continuous'}), + } + +MAKERNOTE_CANON_TAG_0x004 = { + 7: ('WhiteBalance', + {0: 'Auto', + 1: 'Sunny', + 2: 'Cloudy', + 3: 'Tungsten', + 4: 'Fluorescent', + 5: 'Flash', + 6: 'Custom'}), + 9: ('SequenceNumber',), + 14: ('AFPointUsed',), + 15: ('FlashBias', + {0xFFC0: '-2 EV', + 0xFFCC: '-1.67 EV', + 0xFFD0: '-1.50 EV', + 0xFFD4: '-1.33 EV', + 0xFFE0: '-1 EV', + 0xFFEC: '-0.67 EV', + 0xFFF0: '-0.50 EV', + 0xFFF4: '-0.33 EV', + 0x0000: '0 EV', + 0x000C: '0.33 EV', + 0x0010: '0.50 EV', + 0x0014: '0.67 EV', + 0x0020: '1 EV', + 0x002C: '1.33 EV', + 0x0030: '1.50 EV', + 0x0034: '1.67 EV', + 0x0040: '2 EV'}), + 19: ('SubjectDistance',), + } + +# extract multibyte integer in Motorola format (little endian) +def s2n_motorola(str): + x = 0 + for c in str: + x = (x << 8) | ord(c) + return x + +# extract multibyte integer in Intel format (big endian) +def s2n_intel(str): + x = 0 + y = 0 + for c in str: + x = x | (ord(c) << y) + y = y + 8 + return x + +# ratio object that eventually will be able to reduce itself to lowest +# common denominator for printing +def gcd(a, b): + if b == 0: + return a + else: + return gcd(b, a % b) + +class Ratio: + def __init__(self, num, den): + self.num = num + self.den = den + + def __repr__(self): + self.reduce() + if self.den == 1: + return str(self.num) + return '%d/%d' % (self.num, self.den) + + def reduce(self): + div = gcd(self.num, self.den) + if div > 1: + self.num = self.num / div + self.den = self.den / div + +# for ease of dealing with tags +class IFD_Tag: + def __init__(self, printable, tag, field_type, values, field_offset, + field_length): + # printable version of data + self.printable = printable + # tag ID number + self.tag = tag + # field type as index into FIELD_TYPES + self.field_type = field_type + # offset of start of field in bytes from beginning of IFD + self.field_offset = field_offset + # length of data field in bytes + self.field_length = field_length + # either a string or array of data items + self.values = values + + def __str__(self): + return self.printable + + def __repr__(self): + return '(0x%04X) %s=%s @ %d' % (self.tag, + FIELD_TYPES[self.field_type][2], + self.printable, + self.field_offset) + +# class that handles an EXIF header +class EXIF_header: + def __init__(self, file, endian, offset, fake_exif, strict, debug=0): + self.file = file + self.endian = endian + self.offset = offset + self.fake_exif = fake_exif + self.strict = strict + self.debug = debug + self.tags = {} + + # convert slice to integer, based on sign and endian flags + # usually this offset is assumed to be relative to the beginning of the + # start of the EXIF information. For some cameras that use relative tags, + # this offset may be relative to some other starting point. + def s2n(self, offset, length, signed=0): + self.file.seek(self.offset + offset) + slice = self.file.read(length) + if self.endian == 'I': + val = s2n_intel(slice) + else: + val = s2n_motorola(slice) + # Sign extension ? + if signed: + msb = 1 << (8 * length - 1) + if val & msb: + val = val - (msb << 1) + return val + + # convert offset to string + def n2s(self, offset, length): + s = '' + for dummy in range(length): + if self.endian == 'I': + s = s + chr(offset & 0xFF) + else: + s = chr(offset & 0xFF) + s + offset = offset >> 8 + return s + + # return first IFD + def first_IFD(self): + return self.s2n(4, 4) + + # return pointer to next IFD + def next_IFD(self, ifd): + entries = self.s2n(ifd, 2) + return self.s2n(ifd + 2 + 12 * entries, 4) + + # return list of IFDs in header + def list_IFDs(self): + i = self.first_IFD() + a = [] + while i: + a.append(i) + i = self.next_IFD(i) + return a + + # return list of entries in this IFD + def dump_IFD(self, ifd, ifd_name, dict=EXIF_TAGS, relative=0, stop_tag='UNDEF'): + entries = self.s2n(ifd, 2) + for i in range(entries): + # entry is index of start of this IFD in the file + entry = ifd + 2 + 12 * i + tag = self.s2n(entry, 2) + + # get tag name early to avoid errors, help debug + tag_entry = dict.get(tag) + if tag_entry: + tag_name = tag_entry[0] + else: + tag_name = 'Tag 0x%04X' % tag + + # ignore certain tags for faster processing + if not (not detailed and tag in IGNORE_TAGS): + field_type = self.s2n(entry + 2, 2) + + # unknown field type + if not 0 < field_type < len(FIELD_TYPES): + if not self.strict: + continue + else: + raise ValueError('unknown type %d in tag 0x%04X' % (field_type, tag)) + + typelen = FIELD_TYPES[field_type][0] + count = self.s2n(entry + 4, 4) + # Adjust for tag id/type/count (2+2+4 bytes) + # Now we point at either the data or the 2nd level offset + offset = entry + 8 + + # If the value fits in 4 bytes, it is inlined, else we + # need to jump ahead again. + if count * typelen > 4: + # offset is not the value; it's a pointer to the value + # if relative we set things up so s2n will seek to the right + # place when it adds self.offset. Note that this 'relative' + # is for the Nikon type 3 makernote. Other cameras may use + # other relative offsets, which would have to be computed here + # slightly differently. + if relative: + tmp_offset = self.s2n(offset, 4) + offset = tmp_offset + ifd - 8 + if self.fake_exif: + offset = offset + 18 + else: + offset = self.s2n(offset, 4) + + field_offset = offset + if field_type == 2: + # special case: null-terminated ASCII string + # XXX investigate + # sometimes gets too big to fit in int value + if count != 0 and count < (2 ** 31): + self.file.seek(self.offset + offset) + values = self.file.read(count) + #print values + # Drop any garbage after a null. + values = values.split('\x00', 1)[0] + else: + values = '' + else: + values = [] + signed = (field_type in [6, 8, 9, 10]) + + # XXX investigate + # some entries get too big to handle could be malformed + # file or problem with self.s2n + if count < 1000: + for dummy in range(count): + if field_type in (5, 10): + # a ratio + value = Ratio(self.s2n(offset, 4, signed), + self.s2n(offset + 4, 4, signed)) + else: + value = self.s2n(offset, typelen, signed) + values.append(value) + offset = offset + typelen + # The test above causes problems with tags that are + # supposed to have long values! Fix up one important case. + elif tag_name == 'MakerNote' : + for dummy in range(count): + value = self.s2n(offset, typelen, signed) + values.append(value) + offset = offset + typelen + #else : + # print "Warning: dropping large tag:", tag, tag_name + + # now 'values' is either a string or an array + if count == 1 and field_type != 2: + printable = str(values[0]) + elif count > 50 and len(values) > 20 : + printable = str(values[0:20])[0:-1] + ", ... ]" + else: + printable = str(values) + + # compute printable version of values + if tag_entry: + if len(tag_entry) != 1: + # optional 2nd tag element is present + if callable(tag_entry[1]): + # call mapping function + printable = tag_entry[1](values) + else: + printable = '' + for i in values: + # use lookup table for this tag + printable += tag_entry[1].get(i, repr(i)) + + self.tags[ifd_name + ' ' + tag_name] = IFD_Tag(printable, tag, + field_type, + values, field_offset, + count * typelen) + if self.debug: + print(' debug: %s: %s' % (tag_name, + repr(self.tags[ifd_name + ' ' + tag_name]))) + + if tag_name == stop_tag: + break + + # extract uncompressed TIFF thumbnail (like pulling teeth) + # we take advantage of the pre-existing layout in the thumbnail IFD as + # much as possible + def extract_TIFF_thumbnail(self, thumb_ifd): + entries = self.s2n(thumb_ifd, 2) + # this is header plus offset to IFD ... + if self.endian == 'M': + tiff = 'MM\x00*\x00\x00\x00\x08' + else: + tiff = 'II*\x00\x08\x00\x00\x00' + # ... plus thumbnail IFD data plus a null "next IFD" pointer + self.file.seek(self.offset + thumb_ifd) + tiff += self.file.read(entries * 12 + 2) + '\x00\x00\x00\x00' + + # fix up large value offset pointers into data area + for i in range(entries): + entry = thumb_ifd + 2 + 12 * i + tag = self.s2n(entry, 2) + field_type = self.s2n(entry + 2, 2) + typelen = FIELD_TYPES[field_type][0] + count = self.s2n(entry + 4, 4) + oldoff = self.s2n(entry + 8, 4) + # start of the 4-byte pointer area in entry + ptr = i * 12 + 18 + # remember strip offsets location + if tag == 0x0111: + strip_off = ptr + strip_len = count * typelen + # is it in the data area? + if count * typelen > 4: + # update offset pointer (nasty "strings are immutable" crap) + # should be able to say "tiff[ptr:ptr+4]=newoff" + newoff = len(tiff) + tiff = tiff[:ptr] + self.n2s(newoff, 4) + tiff[ptr + 4:] + # remember strip offsets location + if tag == 0x0111: + strip_off = newoff + strip_len = 4 + # get original data and store it + self.file.seek(self.offset + oldoff) + tiff += self.file.read(count * typelen) + + # add pixel strips and update strip offset info + old_offsets = self.tags['Thumbnail StripOffsets'].values + old_counts = self.tags['Thumbnail StripByteCounts'].values + for i in range(len(old_offsets)): + # update offset pointer (more nasty "strings are immutable" crap) + offset = self.n2s(len(tiff), strip_len) + tiff = tiff[:strip_off] + offset + tiff[strip_off + strip_len:] + strip_off += strip_len + # add pixel strip to end + self.file.seek(self.offset + old_offsets[i]) + tiff += self.file.read(old_counts[i]) + + self.tags['TIFFThumbnail'] = tiff + + # decode all the camera-specific MakerNote formats + + # Note is the data that comprises this MakerNote. The MakerNote will + # likely have pointers in it that point to other parts of the file. We'll + # use self.offset as the starting point for most of those pointers, since + # they are relative to the beginning of the file. + # + # If the MakerNote is in a newer format, it may use relative addressing + # within the MakerNote. In that case we'll use relative addresses for the + # pointers. + # + # As an aside: it's not just to be annoying that the manufacturers use + # relative offsets. It's so that if the makernote has to be moved by the + # picture software all of the offsets don't have to be adjusted. Overall, + # this is probably the right strategy for makernotes, though the spec is + # ambiguous. (The spec does not appear to imagine that makernotes would + # follow EXIF format internally. Once they did, it's ambiguous whether + # the offsets should be from the header at the start of all the EXIF info, + # or from the header at the start of the makernote.) + def decode_maker_note(self): + note = self.tags['EXIF MakerNote'] + + # Some apps use MakerNote tags but do not use a format for which we + # have a description, so just do a raw dump for these. + #if self.tags.has_key('Image Make'): + make = self.tags['Image Make'].printable + #else: + # make = '' + + # model = self.tags['Image Model'].printable # unused + + # Nikon + # The maker note usually starts with the word Nikon, followed by the + # type of the makernote (1 or 2, as a short). If the word Nikon is + # not at the start of the makernote, it's probably type 2, since some + # cameras work that way. + if 'NIKON' in make: + if note.values[0:7] == [78, 105, 107, 111, 110, 0, 1]: + if self.debug: + print("Looks like a type 1 Nikon MakerNote.") + self.dump_IFD(note.field_offset + 8, 'MakerNote', + dict=MAKERNOTE_NIKON_OLDER_TAGS) + elif note.values[0:7] == [78, 105, 107, 111, 110, 0, 2]: + if self.debug: + print("Looks like a labeled type 2 Nikon MakerNote") + if note.values[12:14] != [0, 42] and note.values[12:14] != [42, 0]: + raise ValueError("Missing marker tag '42' in MakerNote.") + # skip the Makernote label and the TIFF header + self.dump_IFD(note.field_offset + 10 + 8, 'MakerNote', + dict=MAKERNOTE_NIKON_NEWER_TAGS, relative=1) + else: + # E99x or D1 + if self.debug: + print("Looks like an unlabeled type 2 Nikon MakerNote") + self.dump_IFD(note.field_offset, 'MakerNote', + dict=MAKERNOTE_NIKON_NEWER_TAGS) + return + + # Olympus + if make.startswith('OLYMPUS'): + self.dump_IFD(note.field_offset + 8, 'MakerNote', + dict=MAKERNOTE_OLYMPUS_TAGS) + # XXX TODO + #for i in (('MakerNote Tag 0x2020', MAKERNOTE_OLYMPUS_TAG_0x2020),): + # self.decode_olympus_tag(self.tags[i[0]].values, i[1]) + #return + + # Casio + if 'CASIO' in make or 'Casio' in make: + self.dump_IFD(note.field_offset, 'MakerNote', + dict=MAKERNOTE_CASIO_TAGS) + return + + # Fujifilm + if make == 'FUJIFILM': + # bug: everything else is "Motorola" endian, but the MakerNote + # is "Intel" endian + endian = self.endian + self.endian = 'I' + # bug: IFD offsets are from beginning of MakerNote, not + # beginning of file header + offset = self.offset + self.offset += note.field_offset + # process note with bogus values (note is actually at offset 12) + self.dump_IFD(12, 'MakerNote', dict=MAKERNOTE_FUJIFILM_TAGS) + # reset to correct values + self.endian = endian + self.offset = offset + return + + # Canon + if make == 'Canon': + self.dump_IFD(note.field_offset, 'MakerNote', + dict=MAKERNOTE_CANON_TAGS) + for i in (('MakerNote Tag 0x0001', MAKERNOTE_CANON_TAG_0x001), + ('MakerNote Tag 0x0004', MAKERNOTE_CANON_TAG_0x004)): + self.canon_decode_tag(self.tags[i[0]].values, i[1]) + return + + + # XXX TODO decode Olympus MakerNote tag based on offset within tag + def olympus_decode_tag(self, value, dict): + pass + + # decode Canon MakerNote tag based on offset within tag + # see http://www.burren.cx/david/canon.html by David Burren + def canon_decode_tag(self, value, dict): + for i in range(1, len(value)): + x = dict.get(i, ('Unknown',)) + if self.debug: + print(i, x) + name = x[0] + if len(x) > 1: + val = x[1].get(value[i], 'Unknown') + else: + val = value[i] + # it's not a real IFD Tag but we fake one to make everybody + # happy. this will have a "proprietary" type + self.tags['MakerNote ' + name] = IFD_Tag(str(val), None, 0, None, + None, None) + +# process an image file (expects an open file object) +# this is the function that has to deal with all the arbitrary nasty bits +# of the EXIF standard +def process_file(f, stop_tag='UNDEF', details=True, strict=False, debug=False): + # yah it's cheesy... + global detailed + detailed = details + + # by default do not fake an EXIF beginning + fake_exif = 0 + + # determine whether it's a JPEG or TIFF + data = f.read(12) + if data[0:4] in ['II*\x00', 'MM\x00*']: + # it's a TIFF file + f.seek(0) + endian = f.read(1) + f.read(1) + offset = 0 + elif data[0:2] == '\xFF\xD8': + # it's a JPEG file + while data[2] == '\xFF' and data[6:10] in ('JFIF', 'JFXX', 'OLYM', 'Phot'): + length = ord(data[4]) * 256 + ord(data[5]) + f.read(length - 8) + # fake an EXIF beginning of file + data = '\xFF\x00' + f.read(10) + fake_exif = 1 + if data[2] == '\xFF' and data[6:10] == 'Exif': + # detected EXIF header + offset = f.tell() + endian = f.read(1) + else: + # no EXIF information + return {} + else: + # file format not recognized + return {} + + # deal with the EXIF info we found + if debug: + print({'I': 'Intel', 'M': 'Motorola'}[endian], 'format') + hdr = EXIF_header(f, endian, offset, fake_exif, strict, debug) + ifd_list = hdr.list_IFDs() + ctr = 0 + for i in ifd_list: + if ctr == 0: + IFD_name = 'Image' + elif ctr == 1: + IFD_name = 'Thumbnail' + thumb_ifd = i + else: + IFD_name = 'IFD %d' % ctr + if debug: + print(' IFD %d (%s) at offset %d:' % (ctr, IFD_name, i)) + hdr.dump_IFD(i, IFD_name, stop_tag=stop_tag) + # EXIF IFD + exif_off = hdr.tags.get(IFD_name + ' ExifOffset') + if exif_off: + if debug: + print(' EXIF SubIFD at offset %d:' % exif_off.values[0]) + hdr.dump_IFD(exif_off.values[0], 'EXIF', stop_tag=stop_tag) + # Interoperability IFD contained in EXIF IFD + intr_off = hdr.tags.get('EXIF SubIFD InteroperabilityOffset') + if intr_off: + if debug: + print(' EXIF Interoperability SubSubIFD at offset %d:' \ + % intr_off.values[0]) + hdr.dump_IFD(intr_off.values[0], 'EXIF Interoperability', + dict=INTR_TAGS, stop_tag=stop_tag) + # GPS IFD + gps_off = hdr.tags.get(IFD_name + ' GPSInfo') + if gps_off: + if debug: + print(' GPS SubIFD at offset %d:' % gps_off.values[0]) + hdr.dump_IFD(gps_off.values[0], 'GPS', dict=GPS_TAGS, stop_tag=stop_tag) + ctr += 1 + + # extract uncompressed TIFF thumbnail + thumb = hdr.tags.get('Thumbnail Compression') + if thumb and thumb.printable == 'Uncompressed TIFF': + hdr.extract_TIFF_thumbnail(thumb_ifd) + + # JPEG thumbnail (thankfully the JPEG data is stored as a unit) + thumb_off = hdr.tags.get('Thumbnail JPEGInterchangeFormat') + if thumb_off: + f.seek(offset + thumb_off.values[0]) + size = hdr.tags['Thumbnail JPEGInterchangeFormatLength'].values[0] + hdr.tags['JPEGThumbnail'] = f.read(size) + + # deal with MakerNote contained in EXIF IFD + # (Some apps use MakerNote tags but do not use a format for which we + # have a description, do not process these). + if 'EXIF MakerNote' in hdr.tags and 'Image Make' in hdr.tags and detailed: + hdr.decode_maker_note() + + # Sometimes in a TIFF file, a JPEG thumbnail is hidden in the MakerNote + # since it's not allowed in a uncompressed TIFF IFD + if 'JPEGThumbnail' not in hdr.tags: + thumb_off = hdr.tags.get('MakerNote JPEGThumbnail') + if thumb_off: + f.seek(offset + thumb_off.values[0]) + hdr.tags['JPEGThumbnail'] = file.read(thumb_off.field_length) + + return hdr.tags + + +# show command line usage +def usage(exit_status): + msg = 'Usage: EXIF.py [OPTIONS] file1 [file2 ...]\n' + msg += 'Extract EXIF information from digital camera image files.\n\nOptions:\n' + msg += '-q --quick Do not process MakerNotes.\n' + msg += '-t TAG --stop-tag TAG Stop processing when this tag is retrieved.\n' + msg += '-s --strict Run in strict mode (stop on errors).\n' + msg += '-d --debug Run in debug mode (display extra info).\n' + print(msg) + sys.exit(exit_status) + +# library test/debug function (dump given files) +if __name__ == '__main__': + import sys + import getopt + + # parse command line options/arguments + try: + opts, args = getopt.getopt(sys.argv[1:], "hqsdt:v", ["help", "quick", "strict", "debug", "stop-tag="]) + except getopt.GetoptError: + usage(2) + if args == []: + usage(2) + detailed = True + stop_tag = 'UNDEF' + debug = False + strict = False + for o, a in opts: + if o in ("-h", "--help"): + usage(0) + if o in ("-q", "--quick"): + detailed = False + if o in ("-t", "--stop-tag"): + stop_tag = a + if o in ("-s", "--strict"): + strict = True + if o in ("-d", "--debug"): + debug = True + + # output info for each file + for filename in args: + try: + file = open(filename, 'rb') + except: + print("'%s' is unreadable\n" % filename) + continue + print(filename + ':') + # get the tags + data = process_file(file, stop_tag=stop_tag, details=detailed, strict=strict, debug=debug) + if not data: + print('No EXIF information found') + continue + + x = data.keys() + x.sort() + for i in x: + if i in ('JPEGThumbnail', 'TIFFThumbnail'): + continue + try: + print(' %s (%s): %s' % \ + (i, FIELD_TYPES[data[i].field_type][2], data[i].printable)) + except: + print('error', i, '"', data[i], '"') + if 'JPEGThumbnail' in data: + print('File has JPEG thumbnail') + print() + diff --git a/photologue/utils/__init__.py b/photologue/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/photologue/utils/reflection.py b/photologue/utils/reflection.py new file mode 100644 index 00000000..74d4e378 --- /dev/null +++ b/photologue/utils/reflection.py @@ -0,0 +1,92 @@ +""" Function for generating web 2.0 style image reflection effects. + +Copyright (c) 2007, Justin C. Driscoll +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. 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. + + 3. Neither the name of reflection.py nor the names of its contributors 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. + +""" + +try: + import Image + import ImageColor +except ImportError: + try: + from PIL import Image + from PIL import ImageColor + except ImportError: + raise ImportError("The Python Imaging Library was not found.") + + +def add_reflection(im, bgcolor="#00000", amount=0.4, opacity=0.6): + """ Returns the supplied PIL Image (im) with a reflection effect + + bgcolor The background color of the reflection gradient + amount The height of the reflection as a percentage of the orignal image + opacity The initial opacity of the reflection gradient + + Originally written for the Photologue image management system for Django + and Based on the original concept by Bernd Schlapsi + + """ + # convert bgcolor string to rgb value + background_color = ImageColor.getrgb(bgcolor) + + # copy orignial image and flip the orientation + reflection = im.copy().transpose(Image.FLIP_TOP_BOTTOM) + + # create a new image filled with the bgcolor the same size + background = Image.new("RGB", im.size, background_color) + + # calculate our alpha mask + start = int(255 - (255 * opacity)) # The start of our gradient + steps = int(255 * amount) # the number of intermedite values + increment = (255 - start) / float(steps) + mask = Image.new('L', (1, 255)) + for y in range(255): + if y < steps: + val = int(y * increment + start) + else: + val = 255 + mask.putpixel((0, y), val) + alpha_mask = mask.resize(im.size) + + # merge the reflection onto our background color using the alpha mask + reflection = Image.composite(background, reflection, alpha_mask) + + # crop the reflection + reflection_height = int(im.size[1] * amount) + reflection = reflection.crop((0, 0, im.size[0], reflection_height)) + + # create new image sized to hold both the original image and the reflection + composite = Image.new("RGB", (im.size[0], im.size[1] + reflection_height), background_color) + + # paste the orignal image and the reflection into the composite image + composite.paste(im, (0, 0)) + composite.paste(reflection, (0, im.size[1])) + + # return the image complete with reflection effect + return composite diff --git a/photologue/utils/watermark.py b/photologue/utils/watermark.py new file mode 100644 index 00000000..8ca822df --- /dev/null +++ b/photologue/utils/watermark.py @@ -0,0 +1,64 @@ +""" Function for applying watermarks to images. + +Original found here: +http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/362879 + +""" + +try: + import Image + import ImageEnhance +except ImportError: + try: + from PIL import Image + from PIL import ImageEnhance + except ImportError: + raise ImportError("The Python Imaging Library was not found.") + +def reduce_opacity(im, opacity): + """Returns an image with reduced opacity.""" + assert opacity >= 0 and opacity <= 1 + if im.mode != 'RGBA': + im = im.convert('RGBA') + else: + im = im.copy() + alpha = im.split()[3] + alpha = ImageEnhance.Brightness(alpha).enhance(opacity) + im.putalpha(alpha) + return im + +def apply_watermark(im, mark, position, opacity=1): + """Adds a watermark to an image.""" + if opacity < 1: + mark = reduce_opacity(mark, opacity) + if im.mode != 'RGBA': + im = im.convert('RGBA') + # create a transparent layer the size of the image and draw the + # watermark in that layer. + layer = Image.new('RGBA', im.size, (0, 0, 0, 0)) + if position == 'tile': + for y in range(0, im.size[1], mark.size[1]): + for x in range(0, im.size[0], mark.size[0]): + layer.paste(mark, (x, y)) + elif position == 'scale': + # scale, but preserve the aspect ratio + ratio = min( + float(im.size[0]) / mark.size[0], float(im.size[1]) / mark.size[1]) + w = int(mark.size[0] * ratio) + h = int(mark.size[1] * ratio) + mark = mark.resize((w, h)) + layer.paste(mark, ((im.size[0] - w) / 2, (im.size[1] - h) / 2)) + else: + layer.paste(mark, position) + # composite the watermark with the layer + return Image.composite(layer, im, layer) + +def test(): + im = Image.open('test.png') + mark = Image.open('overlay.png') + watermark(im, mark, 'tile', 0.5).show() + watermark(im, mark, 'scale', 1.0).show() + watermark(im, mark, (100, 100), 0.5).show() + +if __name__ == '__main__': + test() diff --git a/photologue/views.py b/photologue/views.py new file mode 100644 index 00000000..a0ebb335 --- /dev/null +++ b/photologue/views.py @@ -0,0 +1,111 @@ +import warnings + +from django.conf import settings +from django.views.generic.dates import ArchiveIndexView, DateDetailView, DayArchiveView, MonthArchiveView, YearArchiveView +from django.views.generic.detail import DetailView +from django.views.generic.list import ListView +from .models import Photo, Gallery + +# Number of galleries to display per page. +GALLERY_PAGINATE_BY = getattr(settings, 'PHOTOLOGUE_GALLERY_PAGINATE_BY', 20) + +if GALLERY_PAGINATE_BY != 20: + warnings.warn( + DeprecationWarning('PHOTOLOGUE_GALLERY_PAGINATE_BY setting will be removed in Photologue 3.1')) + +# Number of photos to display per page. +PHOTO_PAGINATE_BY = getattr(settings, 'PHOTOLOGUE_PHOTO_PAGINATE_BY', 20) + +if PHOTO_PAGINATE_BY != 20: + warnings.warn( + DeprecationWarning('PHOTOLOGUE_PHOTO_PAGINATE_BY setting will be removed in Photologue 3.1')) + +# Gallery views. + + +class GalleryListView(ListView): + queryset = Gallery.objects.on_site().is_public() + paginate_by = GALLERY_PAGINATE_BY + + def get_context_data(self, **kwargs): + context = super(GalleryListView, self).get_context_data(**kwargs) + if self.kwargs.get('deprecated_pagination', False): + warnings.warn( + DeprecationWarning('Page numbers should now be passed via a page query-string parameter.' + ' The old style "/page/n/"" will be removed in Photologue 3.2')) + return context + + +class GalleryDetailView(DetailView): + queryset = Gallery.objects.on_site().is_public() + + +class GalleryDateView(object): + queryset = Gallery.objects.on_site().is_public() + date_field = 'date_added' + allow_empty = True + + +class GalleryDateDetailView(GalleryDateView, DateDetailView): + pass + + +class GalleryArchiveIndexView(GalleryDateView, ArchiveIndexView): + pass + + +class GalleryDayArchiveView(GalleryDateView, DayArchiveView): + pass + + +class GalleryMonthArchiveView(GalleryDateView, MonthArchiveView): + pass + + +class GalleryYearArchiveView(GalleryDateView, YearArchiveView): + make_object_list = True + +# Photo views. + + +class PhotoListView(ListView): + queryset = Photo.objects.on_site().is_public() + paginate_by = PHOTO_PAGINATE_BY + + def get_context_data(self, **kwargs): + context = super(PhotoListView, self).get_context_data(**kwargs) + if self.kwargs.get('deprecated_pagination', False): + warnings.warn( + DeprecationWarning('Page numbers should now be passed via a page query-string parameter.' + ' The old style "/page/n/"" will be removed in Photologue 3.2')) + return context + + +class PhotoDetailView(DetailView): + queryset = Photo.objects.on_site().is_public() + + +class PhotoDateView(object): + queryset = Photo.objects.on_site().is_public() + date_field = 'date_added' + allow_empty = True + + +class PhotoDateDetailView(PhotoDateView, DateDetailView): + pass + + +class PhotoArchiveIndexView(PhotoDateView, ArchiveIndexView): + pass + + +class PhotoDayArchiveView(PhotoDateView, DayArchiveView): + pass + + +class PhotoMonthArchiveView(PhotoDateView, MonthArchiveView): + pass + + +class PhotoYearArchiveView(PhotoDateView, YearArchiveView): + make_object_list = True diff --git a/proj/production.py b/proj/production.py index 8fd4509b..4360eb31 100644 --- a/proj/production.py +++ b/proj/production.py @@ -5,10 +5,10 @@ DEBUG = True # изменить когда будет продакшн DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', - 'NAME': 'test', + 'NAME': 'test2', 'USER': 'kotzilla', 'PASSWORD': 'qazedc', 'HOST': '', 'PORT': '', } -} \ No newline at end of file +} diff --git a/proj/settings.py b/proj/settings.py index 7b08caa9..261923a3 100644 --- a/proj/settings.py +++ b/proj/settings.py @@ -334,6 +334,7 @@ INSTALLED_APPS = ( 'bitfield', 'djutils', 'pytils', + 'password_reset', #'social_auth', 'social.apps.django_app.default', #'south', diff --git a/proj/urls.py b/proj/urls.py index dc081820..53b8125c 100644 --- a/proj/urls.py +++ b/proj/urls.py @@ -46,7 +46,7 @@ urlpatterns = patterns('', #url(r'^places/(?P.*)/(?Pphoto)', 'place_exposition.views.place'), #url(r'^places/(?P.*)', 'place_exposition.views.place'), #url(r'^company/(?P.*)', 'core.views.company'), - + url(r'^', include('password_reset.urls')), url(r'^i18n/', include('django.conf.urls.i18n')), #url(r'^social/', include('social_auth.urls')), @@ -55,11 +55,13 @@ urlpatterns = patterns('', url(r'^search/', include('haystack.urls')), url(r'^admin/', include('proj.admin_urls')), url(r'^', include('service.urls')), + ) # ajax urls urlpatterns += patterns('', url(r'^register/', 'registration.backends.default.views.RegisterAjaxView'), + url(r'^register-complete/', 'registration.backends.default.views.complete_registration'), url(r'^callback/', 'core.simple_index_view.callback'), # url(r'^profile/change-password/', 'accounts.views.change_password'), diff --git a/proj/views.py b/proj/views.py index 9c984579..87dca9d8 100644 --- a/proj/views.py +++ b/proj/views.py @@ -12,11 +12,17 @@ from article.models import Article from functions.forms import ThemeSearch, PlaceSearch from functions.search_forms import EventSearchForm from functions.custom_views import ExpoListView - +from accounts.forms import RegistrationCompleteForm def expo_context(request): cont = {'theme_search_form': ThemeSearch(), 'place_search_form': PlaceSearch(), 'expo_catalog': Exposition.catalog, 'book_aid': settings.BOOKING_AID} + + user = request.user + if not user.is_anonymous() and not user.url: + cont.update({'reg_complete': RegistrationCompleteForm(instance=user)}) + + return cont diff --git a/registration/backends/default/views.py b/registration/backends/default/views.py index 88c2b4b2..467cae05 100644 --- a/registration/backends/default/views.py +++ b/registration/backends/default/views.py @@ -128,9 +128,13 @@ class ActivationView(BaseActivationView): """ activated_user = RegistrationProfile.objects.activate_user(activation_key) if activated_user: + signals.user_activated.send(sender=self.__class__, user=activated_user, request=request) + activated_user.backend = 'django.contrib.auth.backends.ModelBackend' + login(request, activated_user) + return activated_user def get_success_url(self, request, user): @@ -208,3 +212,34 @@ def LoginView(request): else: HttpResponseRedirect('/') + +from accounts.forms import RegistrationCompleteForm, RecoveryForm +def complete_registration(request): + if request.is_ajax(): + response = {'success': False} + form = RegistrationCompleteForm(request.POST, instance=request.user) + if form.is_valid(): + form.save() + response['success']=True + else: + response['errors'] = form.errors + return HttpResponse(json.dumps(response), content_type='application/json') + + else: + return HttpResponse('not ajax') + +def pswd_recovery(request): + #if request.is_ajax(): + response = {'success': False} + form = RecoveryForm(request.POST) + if form.is_valid(): + user = form.get_user() + user.se + response['success']=True + else: + response['errors'] = form.errors + return HttpResponse(json.dumps(response), content_type='application/json') + + #else: + # return HttpResponse('not ajax') + diff --git a/static/client/css/main.css b/static/client/css/main.css index d41b45df..084a4a8b 100644 --- a/static/client/css/main.css +++ b/static/client/css/main.css @@ -4054,7 +4054,7 @@ form.s-message { } .c-select-box .csb-menu .scroll-content { - padding: 5px 18px; + padding: 5px 10px; } .c-select-box .csb-menu ul { @@ -4072,6 +4072,7 @@ form.s-message { cursor: pointer; color: #464646; position: relative; + margin-left: 12px; } .c-select-box .csb-menu label.active { @@ -5107,7 +5108,7 @@ form.s-message { } .cli-photo-list .cli-phg-bot .cli-pb-button { - background-position: -225px -32px; + background-position: -345px -32px; } .cl-item .cli-status .status.moderated:before { @@ -11876,9 +11877,9 @@ margin: 5px -11px 0 -15px;} .end_reg_list li table tr th {text-align:left;vertical-align:top;padding:13px 5px 0 0;font-size:17px;color:#000;font-weight:normal;} .end_reg_list li table tr td {text-align:left;vertical-align:top;} .end_reg_list li table tr td p {padding:0 0 25px 0;margin:0 0 0 0;text-align:center;font-size:13px;color:#a2a2a2;} - .end_reg_list li table tr td.width1 {width:78px;padding:0 9px 0 0;} + .end_reg_list li table tr td.width1 {width:98px;padding:0 9px 0 0;} .end_reg_list li table tr td.width2 {width:88px;padding:0 9px 0 0;} - .end_reg_list li table tr td.width3 {width:205px;} + .end_reg_list li table tr td.width3 {width:185px;} .add_pic_block {display:block;width:100px;height:80px;padding:20px 0 0 0;text-align:center;font-size:12px;color:#a2a2a2;font-weight:500;text-decoration:none;position:relative;line-height:1.0;-webkit-transition:background .3s, color .3s;-moz-transition:background .3s, color .3s;-ms-transition:background .3s, color .3s;-o-transition:background .3s, color .3s;transition:background .3s, color .3s;font-family:'dindisplay_pro';} .add_pic_block span {display:block;margin:0 auto;width:35px;height:35px;background-color:#d0d0d0;-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;background-image:url(../img/add_pic_block_bg.png);background-position:center center;background-repeat:no-repeat;-webkit-transition:background .3s, color .3s;-moz-transition:background .3s, color .3s;-ms-transition:background .3s, color .3s;-o-transition:background .3s, color .3s;transition:background .3s, color .3s; position: relative;} diff --git a/static/client/css/pages/exposition_by.css b/static/client/css/pages/exposition_by.css new file mode 100644 index 00000000..66472484 --- /dev/null +++ b/static/client/css/pages/exposition_by.css @@ -0,0 +1,24 @@ +.leter-list{ + list-style: none; +} + +.leter-list li{ + margin-bottom: 2px; + margin-left: -10px; +} + +.leter-list li a:hover{ + text-decoration: none; + color: #ff6600; + border-color: transparent; +} + +.leter-list li a { + display: inline-block; + font-size: 14px; + line-height: 17px; + text-decoration: underline; + color: #464646; + padding: 2px 15px 2px 9px; + border-color: transparent; +} diff --git a/static/client/css/regions.css b/static/client/css/regions.css index 64b3fcc7..b21d9b30 100644 --- a/static/client/css/regions.css +++ b/static/client/css/regions.css @@ -40,7 +40,7 @@ top: 3px; left: -15px; z-index: 1010; - background: url('../img/sprites.png') no-repeat -225px -135px ; + background: url('../img/sprites.png') no-repeat -345px -135px ; } .c-select-box-wrap .custom-radio-check.active:before { content: ''; diff --git a/static/client/img/sprites.png b/static/client/img/sprites.png index 77d3a20cd94a59d137a9d81fd717c0fd9a0424e3..53172223a6d6fa3829fbc4f60d59b18ce4e08f8f 100644 GIT binary patch delta 16765 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 qzXvB5K%!&kWf0M8w3=UmJ;bk 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 af1?ujj").attr("class", "error").append( + // $("")); + } +} + +$(document).ready(function () { + + placeInput('100%'); + $('#id_code_country').select2({ + width: '95px' + }); + + + $.fancybox.open([ + { + href : '#end-reg' + } + ], { + padding : 0, + fitToView: false, + closeBtn : false, // hide close button + closeClick : false, // prevents closing when clicking INSIDE fancybox + helpers : { + // prevents closing when clicking OUTSIDE fancybox + overlay : {closeClick: false} + }, + keys : { + // prevents closing when press ESC button + close : null + } + }); + + $('#end-reg-form').on('submit', function(e){ + e.preventDefault(); + var url = $(this).attr('action'); + var formData = $(this).serialize(); + $.post(url, formData, registrationSuccess) + }); + + }); diff --git a/static/client/js/pages/profile.js b/static/client/js/pages/profile.js index f368f7ac..735bdf73 100644 --- a/static/client/js/pages/profile.js +++ b/static/client/js/pages/profile.js @@ -139,7 +139,8 @@ $(document).ready(function(){ $('#id_theme').select2({ width: 'element', - placeholder: 'Выберите тематику компании' + placeholder: 'Выберите тематику компании', + maximumSelectionSize: 3 }); $('#id_city').select2({ @@ -180,7 +181,7 @@ $(document).ready(function(){ $('#id_company').select2({ placeholder: "Search company", - width: 'element', + width: '200px', minimumInputLength: 1, ajax: { diff --git a/static/client/js/pages/profile_company.js b/static/client/js/pages/profile_company.js index 5862fd2b..c5e3b67b 100644 --- a/static/client/js/pages/profile_company.js +++ b/static/client/js/pages/profile_company.js @@ -73,6 +73,7 @@ $(document).ready(function(){ placeholder: "Выберите ключевые теги", width: '368px', multiple: true, + maximumSelectionSize: 5, ajax: { url: "/theme/get-tag/", @@ -101,6 +102,7 @@ $(document).ready(function(){ } }, initSelection : function(element, callback) { + /* var data = []; $(element.val().split(",")).each(function(i) { var item = this.split(':'); @@ -110,6 +112,7 @@ $(document).ready(function(){ }); }); callback(data); + */ } diff --git a/static/css/pages/exposition_by.css b/static/css/pages/exposition_by.css new file mode 100644 index 00000000..66472484 --- /dev/null +++ b/static/css/pages/exposition_by.css @@ -0,0 +1,24 @@ +.leter-list{ + list-style: none; +} + +.leter-list li{ + margin-bottom: 2px; + margin-left: -10px; +} + +.leter-list li a:hover{ + text-decoration: none; + color: #ff6600; + border-color: transparent; +} + +.leter-list li a { + display: inline-block; + font-size: 14px; + line-height: 17px; + text-decoration: underline; + color: #464646; + padding: 2px 15px 2px 9px; + border-color: transparent; +} diff --git a/static/ninjaplugin/plugin/index.html b/static/ninjaplugin/plugin/index.html new file mode 100644 index 00000000..1258d7da --- /dev/null +++ b/static/ninjaplugin/plugin/index.html @@ -0,0 +1,24 @@ + + + + + Plugin + + + + + + + +
      + + +
      + + \ No newline at end of file diff --git a/static/ninjaplugin/plugin/init.js b/static/ninjaplugin/plugin/init.js new file mode 100644 index 00000000..3a67ef73 --- /dev/null +++ b/static/ninjaplugin/plugin/init.js @@ -0,0 +1,16 @@ +$(document).ready(function() { + var idCountry = $('#id_country').ninjaSelect({ + url: '/get/country/', + itemsPerPage: 10 + }); + + var plugin = idCountry.data().ninjaSelect; + plugin.options.data = { + city: '1' + }; + + $('#id_theme').ninjaSelect({ + url: '/get/theme/', + itemsPerPage: 10 + }); +}) \ No newline at end of file diff --git a/static/ninjaplugin/plugin/jquery.mousewheel.js b/static/ninjaplugin/plugin/jquery.mousewheel.js new file mode 100644 index 00000000..fdb382d2 --- /dev/null +++ b/static/ninjaplugin/plugin/jquery.mousewheel.js @@ -0,0 +1,213 @@ +(function (factory) { + if ( typeof define === 'function' && define.amd ) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS style for Browserify + module.exports = factory; + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + + var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'], + toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ? + ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'], + slice = Array.prototype.slice, + nullLowestDeltaTimeout, lowestDelta; + + if ( $.event.fixHooks ) { + for ( var i = toFix.length; i; ) { + $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks; + } + } + + var special = $.event.special.mousewheel = { + version: '3.1.12', + + setup: function() { + if ( this.addEventListener ) { + for ( var i = toBind.length; i; ) { + this.addEventListener( toBind[--i], handler, false ); + } + } else { + this.onmousewheel = handler; + } + // Store the line height and page height for this particular element + $.data(this, 'mousewheel-line-height', special.getLineHeight(this)); + $.data(this, 'mousewheel-page-height', special.getPageHeight(this)); + }, + + teardown: function() { + if ( this.removeEventListener ) { + for ( var i = toBind.length; i; ) { + this.removeEventListener( toBind[--i], handler, false ); + } + } else { + this.onmousewheel = null; + } + // Clean up the data we added to the element + $.removeData(this, 'mousewheel-line-height'); + $.removeData(this, 'mousewheel-page-height'); + }, + + getLineHeight: function(elem) { + var $elem = $(elem), + $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent'](); + if (!$parent.length) { + $parent = $('body'); + } + return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16; + }, + + getPageHeight: function(elem) { + return $(elem).height(); + }, + + settings: { + adjustOldDeltas: true, // see shouldAdjustOldDeltas() below + normalizeOffset: true // calls getBoundingClientRect for each event + } + }; + + $.fn.extend({ + mousewheel: function(fn) { + return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel'); + }, + + unmousewheel: function(fn) { + return this.unbind('mousewheel', fn); + } + }); + + + function handler(event) { + var orgEvent = event || window.event, + args = slice.call(arguments, 1), + delta = 0, + deltaX = 0, + deltaY = 0, + absDelta = 0, + offsetX = 0, + offsetY = 0; + event = $.event.fix(orgEvent); + event.type = 'mousewheel'; + + // Old school scrollwheel delta + if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; } + if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; } + if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; } + if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; } + + // Firefox < 17 horizontal scrolling related to DOMMouseScroll event + if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { + deltaX = deltaY * -1; + deltaY = 0; + } + + // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy + delta = deltaY === 0 ? deltaX : deltaY; + + // New school wheel delta (wheel event) + if ( 'deltaY' in orgEvent ) { + deltaY = orgEvent.deltaY * -1; + delta = deltaY; + } + if ( 'deltaX' in orgEvent ) { + deltaX = orgEvent.deltaX; + if ( deltaY === 0 ) { delta = deltaX * -1; } + } + + // No change actually happened, no reason to go any further + if ( deltaY === 0 && deltaX === 0 ) { return; } + + // Need to convert lines and pages to pixels if we aren't already in pixels + // There are three delta modes: + // * deltaMode 0 is by pixels, nothing to do + // * deltaMode 1 is by lines + // * deltaMode 2 is by pages + if ( orgEvent.deltaMode === 1 ) { + var lineHeight = $.data(this, 'mousewheel-line-height'); + delta *= lineHeight; + deltaY *= lineHeight; + deltaX *= lineHeight; + } else if ( orgEvent.deltaMode === 2 ) { + var pageHeight = $.data(this, 'mousewheel-page-height'); + delta *= pageHeight; + deltaY *= pageHeight; + deltaX *= pageHeight; + } + + // Store lowest absolute delta to normalize the delta values + absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) ); + + if ( !lowestDelta || absDelta < lowestDelta ) { + lowestDelta = absDelta; + + // Adjust older deltas if necessary + if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { + lowestDelta /= 40; + } + } + + // Adjust older deltas if necessary + if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { + // Divide all the things by 40! + delta /= 40; + deltaX /= 40; + deltaY /= 40; + } + + // Get a whole, normalized value for the deltas + delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta); + deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta); + deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta); + + // Normalise offsetX and offsetY properties + if ( special.settings.normalizeOffset && this.getBoundingClientRect ) { + var boundingRect = this.getBoundingClientRect(); + offsetX = event.clientX - boundingRect.left; + offsetY = event.clientY - boundingRect.top; + } + + // Add information to the event object + event.deltaX = deltaX; + event.deltaY = deltaY; + event.deltaFactor = lowestDelta; + event.offsetX = offsetX; + event.offsetY = offsetY; + // Go ahead and set deltaMode to 0 since we converted to pixels + // Although this is a little odd since we overwrite the deltaX/Y + // properties with normalized deltas. + event.deltaMode = 0; + + // Add event and delta to the front of the arguments + args.unshift(event, delta, deltaX, deltaY); + + // Clearout lowestDelta after sometime to better + // handle multiple device types that give different + // a different lowestDelta + // Ex: trackpad = 3 and mouse wheel = 120 + if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); } + nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200); + + return ($.event.dispatch || $.event.handle).apply(this, args); + } + + function nullLowestDelta() { + lowestDelta = null; + } + + function shouldAdjustOldDeltas(orgEvent, absDelta) { + // If this is an older event and the delta is divisable by 120, + // then we are assuming that the browser is treating this as an + // older mouse wheel event and that we should divide the deltas + // by 40 to try and get a more usable deltaFactor. + // Side note, this actually impacts the reported scroll distance + // in older browsers and can cause scrolling to be slower than native. + // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false. + return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0; + } + +})); \ No newline at end of file diff --git a/static/ninjaplugin/plugin/plugin.css b/static/ninjaplugin/plugin/plugin.css new file mode 100644 index 00000000..f0aaf070 --- /dev/null +++ b/static/ninjaplugin/plugin/plugin.css @@ -0,0 +1,69 @@ +[for="id_country"], [for="id_theme"] { + float: left; + margin-right: 10px; +} + +.ninjaSelect { + display: inline-block; + width: 300px; + min-height: 25px; + border: 1px solid #000; + border-radius: 4px; +} +.ninjaSelect > input { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + + min-height: 25px; + padding: 0 5px; + width: 100%; + border-radius: 4px; + border: 0; +} +.ninjaSelect_wrapper { + max-height: 185px; + overflow-y: scroll; + border-top: 1px solid #000; + background: #fff; + border-radius: 0 0 4px 4px; +} + +.ninjaSelect_selected { + border-top: 1px dotted red; + border-bottom: 1px dotted red; + padding: 0 3px; + display: none; + background: #fff; +} + +.ninjaSelect_item { + display: inline-block; + vertical-align: top; + background: orange; + border-radius: 4px; + color: #fff; + padding: 2px 8px; + margin: 2px 5px 2px 0; + cursor: pointer; +} + +.ninjaSelect_list { + margin: 0; + padding: 0; + list-style: none; + padding: 3px 3px 0 3px; +} +.ninjaSelect_list > li { + border: 1px solid #b37550; + border-radius: 3px; + margin: 0 0 3px; + padding: 0 3px 2px; + line-height: normal; + cursor: pointer; + color: #b37550; +} +.ninjaSelect_list > li:hover, .ninjaSelect_list > li.active { + color: #000; + border-color: #000; +} \ No newline at end of file diff --git a/static/ninjaplugin/plugin/plugin.js b/static/ninjaplugin/plugin/plugin.js new file mode 100644 index 00000000..2940ae7c --- /dev/null +++ b/static/ninjaplugin/plugin/plugin.js @@ -0,0 +1,147 @@ +!function ($) { + + "use strict"; + + function ninjaSelect(element, options) { + this.$element = $(element); + this.options = $.extend({}, $.fn.ninjaSelect.defaults, options); + this.page = 1; + + this.init(); + } + + ninjaSelect.prototype = { + + constructor: ninjaSelect, + + init: function() { + var self = this, allow = true; + + self.$div = $('
      ', {'id': 'ninja_' + this.$element.attr('id'), 'class': 'ninjaSelect'}), + self.$input = $(''), + self.$list = $('
      ', {'class': 'ninjaSelect_wrapper'}).hide(); + self.$selected = $('
      ', {'class': 'ninjaSelect_selected'}); + self.$ul = $('
        ', {'class': 'ninjaSelect_list'}); + + self.$element.hide().after( + self.$div.append( + self.$input, self.$selected, self.$list.append( + self.$ul + ) + ) + ); + + self.$input.on('keyup', function(e) { + self.loadData($(this).val()); + }); + + self.$ul.delegate('li', 'click', function(e) { + var id = $(this).data().id, allow = true; + + self.$selected.show().find('.ninjaSelect_item').each(function() { + if ($(this).data().id == id) { + allow = false; + } + }); + + if (!self.options.multiple && $('.ninjaSelect_item').length == 1) { + allow = false; + } + + if (allow) { + $(this).addClass('active'); + + self.$selected.append( + $('
        ', {'class': 'ninjaSelect_item'}).data({'id': id, 'index': $(this).index()}).text($(this).text()).click(function() { + self.$ul.find('li').eq($(this).data().index).removeClass('active'); + $(this).next().remove().end().remove(); + + if (!self.$selected.find('.ninjaSelect_item').length) { + self.$selected.hide() + } + }), + $('', {'type': 'hidden', 'name': $(this).text() + '_' + id}).val($(this).text()) + ) + } + }); + + self.$list.mousewheel(function(e, delta) { + if (delta < 0) { + if ($(this).scrollTop() + $(this).innerHeight() >= self.$ul.innerHeight() && allow) { + allow = false; + + self.loadData(self.$input.val(), function() { + allow = true; + }) + } + } + }); + + $(document).delegate('body', 'click', function(e) { + if ($(e.target).closest('.ninjaSelect_list').length == 0) { + self.$list.hide(); + self.$ul.empty(); + } + }) + }, + + loadData: function(val, callback) { + var self = this, len = val.length; + + if (len >= self.options.minLength) { + $.get(self.options.url, {offset: self.page, count: self.options.itemsPerPage, value: val, data: self.options.data}, function(json) { + if (json.length) { + if (json.length >= self.options.itemsPerPage) { + self.page++; + } + + self.$list.show(); + + json.forEach(function(item, i, arr) { + self.$ul.append( + $('
      • ').text(item.text).data('id', item.id) + ) + }) + + + if (self.page == 1) { + self.$list.animate({scrollTop: 0}, 0); + } else { + self.$list.css({scrollTop: self.$list.scrollTop()}, 0); + } + + if (callback) { + callback(); + } + } else { + self.$list.hide(); + self.$ul.empty(); + } + }, 'json'); + } else { + self.$list.hide(); + self.$ul.empty(); + } + } + + } + + $.fn.ninjaSelect = function(options) { + return this.each(function() { + var $this = $(this), data = $this.data('ninjaSelect'); + + if (!data) { + $this.data('ninjaSelect', (data = new ninjaSelect(this, options))) + } + }) + } + + $.fn.ninjaSelect.defaults = { + url: '/ajax.php', + data: {}, + minLength: 2, + itemsPerPage: 3, + multiple: true + } + +}(jQuery); \ No newline at end of file diff --git a/templates/client/accounts/fill_company.html b/templates/client/accounts/fill_company.html index de406bc1..8985c166 100644 --- a/templates/client/accounts/fill_company.html +++ b/templates/client/accounts/fill_company.html @@ -173,7 +173,7 @@
        {% for th in request.user.company.theme.all %} - {{ th.name }}{% ifnotequal forloop.counter request.user.company.theme.all|length %},{% endifnotequal %} + {{ th.name }}{% ifnotequal forloop.counter request.user.company.theme.all|length %},{% endifnotequal %} {% endfor %}
        @@ -241,10 +241,36 @@ Добавить
          -
        • Facebook
        • -
        • LinkedIn
        • -
        • В контакте
        • -
        • Twitter
        • +
        • + {% if social_form.facebook.value %} + Facebook + {% else %} + Facebook + {% endif %} +
        • +
        • + {% if social_form.linkedin.value %} + LinkedIn + {% else %} + LinkedIn + {% endif %} + +
        • + {% if social_form.vk.value %} + В контакте + {% else %} + В контакте + {% endif %} +
        • + +
        • + {% if social_form.twitter.value %} + Twitter + {% else %} + Twitter + {% endif %} +
        • +
        diff --git a/templates/client/accounts/new_profile.html b/templates/client/accounts/new_profile.html index 67c67540..eccd15b8 100644 --- a/templates/client/accounts/new_profile.html +++ b/templates/client/accounts/new_profile.html @@ -5,6 +5,13 @@ {% block style %} + + {% if not company_form %} + + {% endif %} {% endblock %} @@ -142,7 +149,7 @@
      • {# position #} - - +
      @@ -210,10 +217,35 @@ Добавить
        -
      • Facebook
      • -
      • LinkedIn
      • -
      • В контакте
      • -
      • Twitter
      • +
      • + {% if social_form.facebook.value %} + Facebook + {% else %} + Facebook + {% endif %} +
      • +
      • + {% if social_form.linkedin.value %} + LinkedIn + {% else %} + LinkedIn + {% endif %} + +
      • + {% if social_form.vk.value %} + В контакте + {% else %} + В контакте + {% endif %} +
      • + +
      • + {% if social_form.twitter.value %} + Twitter + {% else %} + Twitter + {% endif %} +
      @@ -301,7 +333,7 @@
      diff --git a/templates/client/popups/pswd_recovery.html b/templates/client/popups/pswd_recovery.html new file mode 100644 index 00000000..daa4547d --- /dev/null +++ b/templates/client/popups/pswd_recovery.html @@ -0,0 +1,22 @@ +{% load static %} +{% load i18n %} +{% load url from future %} + + diff --git a/templates/client/popups/reg_send.html b/templates/client/popups/reg_send.html new file mode 100644 index 00000000..b89ac63d --- /dev/null +++ b/templates/client/popups/reg_send.html @@ -0,0 +1,8 @@ +{% load static %} +{% load i18n %} + + \ No newline at end of file diff --git a/templates/client/popups/user_information.html b/templates/client/popups/user_information.html new file mode 100644 index 00000000..b585b685 --- /dev/null +++ b/templates/client/popups/user_information.html @@ -0,0 +1,51 @@ +{% load static %} +{% load i18n %} + + + + +

      %#R45$qkB*Wr*dhCu{Y1@$9 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